<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Natlive's blog

    A long way and dream.

     

    Struts2 自定義標(biāo)簽的方法

    又回鍋弄Struts2……

    看完uitag這部份,發(fā)現(xiàn)一個(gè)問題,就是如果我要一個(gè)pagebar這樣的UITag怎么辦?總不能每一頁我都在JSP上寫吧?就算是復(fù)制都很不聰明。于是開始研究怎么去寫一個(gè)Tag,在網(wǎng)站找了N多文章,大都是用out.println(...)這樣的方式,而沒有使用template的方式,自己總覺得這樣的方式不靈活而且麻煩,容易出錯(cuò),于是查看struts2的源碼,終于找出怎么去寫Struts2 Tag的方法。

    Struts2 的UITag原理:
    Struts2 UITag分三部份組成,一部份用于定義Tag的內(nèi)容與邏輯的UIBean,一部份用于定義JSP Tag,也就是平時(shí)我們定義的那種,最后就是Template,它存放在你的theme目錄之下,是一個(gè)FreeMarker模板文件。

    我現(xiàn)在輯寫一份MMTag,它主要是用于輸出帶鏈接的文字,比如像這樣:
    <cur:mm message="'I am a boy.'" />
    就會(huì)輸出:
    <a href="http://m.tkk7.com/natlive">I am boy.</a>

    我們先寫UIBean部份:我們把它定義為MM,它繼承于org.apache.struts2.components.UIBean:
    package limitstudy.corestruts2.tag;

    import org.apache.struts2.components.UIBean;
    import org.apache.struts2.views.annotations.StrutsTag;
    import org.apache.struts2.views.annotations.StrutsTagAttribute;
    import com.opensymphony.xwork2.util.ValueStack;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    @StrutsTag(name
    ="mm", tldTagClass="limitstudy.corestruts2.tag.MMTag", description="MM")
    public class MM extends UIBean {
        
    private String message;

        
    public MM(ValueStack stack, HttpServletRequest request, HttpServletResponse response) {
            
    super(stack, request, response);
        }

        @Override
        
    protected String getDefaultTemplate() {
            
    return "mm";
        }

        @StrutsTagAttribute(description
    ="set message", type="String")
        
    public void setMessage(String message) {
            
    this.message = message;
        }

        @Override
        
    protected void evaluateExtraParams() {
            
    super.evaluateExtraParams();

            
    if (null != message) {
                addParameter(
    "message", findString(message));
            }
        }
    }

    * strutsTag注解指明了該UIBean的名字和Tag類的類名。

    * getDefaultTemplate()方法用于返回模板的名字,Struts2會(huì)自動(dòng)在后面加入.ftl擴(kuò)展名以找到特定的模板文件。
    * setXXX,設(shè)置UIBean的屬性,一般Tag中有幾個(gè)這樣的屬性,這里就有幾個(gè)。@StrutsTagAttribute(description="set message", type="String")注解,說明該屬性是字符串(也可以是其它),這一步很重要。
    * 覆寫evaluateExtraParams()方法,在UIBean初始化后會(huì)調(diào)用這個(gè)方法來初始化設(shè)定參數(shù),如addParameter方法,會(huì)在freemarker里的parameters里加入一個(gè)key value。這里要注意findString,還有相關(guān)的findxxxx方法,它們是已經(jīng)封裝好了的解釋ognl語法的工具,具體是怎么樣的,大家可以查看一下UIBean的api doc。

    然后是Tag部份:
    package limitstudy.corestruts2.tag;

    import org.apache.struts2.views.jsp.ui.AbstractUITag;
    import org.apache.struts2.components.Component;
    import com.opensymphony.xwork2.util.ValueStack;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    public class MMTag extends AbstractUITag {
        
    private String message;

        @Override
        
    public Component getBean(ValueStack stack, HttpServletRequest request, HttpServletResponse response) {
            
    return new MM(stack, request, response);
        }

        @Override
        
    protected void populateParams() {
            
    super.populateParams();

            MM mm 
    = (MM)component;
            mm.setMessage(message);
        }

        
    public void setMessage(String message) {
            
    this.message = message;
        }
    }

    * getBean()返回該Tag中的UIBean。
    *
    populateParams()初始化參數(shù),一般用來初始化UIBean(Component)。
    * setXXXX設(shè)置屬性,和jsp tag是一樣的。

    在/WEB-INF/tlds/下建立current.tld文件(文名隨你喜歡):
    <?xml version="1.0" encoding="UTF-8"?>
    <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"
            xsi:schemaLocation
    ="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">
        
    <description>test</description>
        
    <tlib-version>2.0</tlib-version>
        
    <short-name>cur</short-name>
        
    <uri>/cur</uri>

        
    <tag>
            
    <name>mm</name>
            
    <tag-class>limitstudy.corestruts2.tag.MMTag</tag-class>
            
    <body-content>JSP</body-content>
            
    <attribute>
                
    <name>message</name>
                
    <required>true</required>
            
    </attribute>
        
    </tag>
    </taglib>

    在源代碼目錄中建立template/simple目錄(這個(gè)目錄名和你的theme有關(guān)),然后在里面建一個(gè)mm.ftl文件:
    <href="http://www.yinsha.com">${parameters.message?html}</a>

    建一個(gè)action測試一下,視圖文件:
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <%@ taglib prefix="cur" uri="/cur" %>
    <html>
    <head>
        
    <title><s:property value="message" /></title>
    </head>
    <body>
    <cur:mm message="haoahahhahaha" />
    </body>
    </html>

    完。

    PS:寫得有些粗鄙,所以,如有問題的,可以留言。

    posted on 2009-05-21 11:00 狂龍 閱讀(5394) 評論(4)  編輯  收藏 所屬分類: Struts2

    評論

    # re: Struts2 自定義標(biāo)簽的方法 2009-05-26 15:16 I'm 路過

    不錯(cuò),受益匪淺,謝謝啦  回復(fù)  更多評論   

    # re: Struts2 自定義標(biāo)簽的方法 2009-06-12 22:44 lingtianlan

    學(xué)習(xí)了,謝謝!  回復(fù)  更多評論   

    # re: Struts2 自定義標(biāo)簽的方法 2009-12-13 18:47 學(xué)習(xí)

    <a href="http://www.yinsha.com">${parameters.message?html}</a> 請問下 這里面的?html是做什么的  回復(fù)  更多評論   

    # re: Struts2 自定義標(biāo)簽的方法 2012-11-15 12:04 alexliu

    "看完uitag這部份,發(fā)現(xiàn)一個(gè)問題,就是如果我要一個(gè)pagebar這樣的UITag怎么辦?總不能每一頁我都在JSP上寫吧?就算是復(fù)制都很不聰明。于是開始研究怎么去寫一個(gè)Tag,在網(wǎng)站找了N多文章,大都是用out.println(...)這樣的方式,而沒有使用template的方式,自己總覺得這樣的方式不靈活而且麻煩,容易出錯(cuò),于是查看struts2的源碼,終于找出怎么去寫Struts2 Tag的方法......"

    我的經(jīng)歷和你一模一樣啊,就感覺out.println(...)太麻煩,結(jié)果追蹤到FreeMarker模板,然后就找到你這篇文章!真的太感謝了!  回復(fù)  更多評論   


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(2)

    隨筆分類

    隨筆檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲色少妇熟女11p| 久久九九免费高清视频 | 内射无码专区久久亚洲| 中美日韩在线网免费毛片视频 | 日韩在线视频线视频免费网站| 亚洲AV综合色区无码一区爱AV| 国产免费不卡v片在线观看| 麻豆一区二区三区蜜桃免费| 亚洲视频在线免费观看| 男女交性永久免费视频播放| 国内精品免费在线观看 | a级成人毛片免费图片| 亚洲综合久久一本伊伊区| 一本色道久久综合亚洲精品高清| 亚洲日产无码中文字幕| 免费v片在线观看视频网站| 精品亚洲aⅴ在线观看| 国产成人精品免费视频大全五级| 久久九九全国免费| 亚洲爆乳成av人在线视菜奈实| 亚洲av无码潮喷在线观看| 国产免费观看视频| 亚洲一区二区免费视频| 九一在线完整视频免费观看| 亚洲综合小说另类图片动图 | 激情吃奶吻胸免费视频xxxx| 亚洲天天做日日做天天欢毛片| 免费a在线观看播放| 在线看片v免费观看视频777| 日本三级在线观看免费| 久久精品国产亚洲av瑜伽| 亚洲日本香蕉视频观看视频| 亚洲色欲久久久综合网东京热| 在线免费观看国产视频| 97热久久免费频精品99| 少妇太爽了在线观看免费视频| 久久国产精品免费一区二区三区| 亚洲男人的天堂网站| 亚洲国产人成在线观看| 亚洲国产老鸭窝一区二区三区| 亚洲中文字幕无码久久精品1|