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://www.aygfsteel.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 狂龍 閱讀(5402) 評(píng)論(4)  編輯  收藏 所屬分類: Struts2

          評(píng)論

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

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

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

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

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

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

          # 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ù)  更多評(píng)論   


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


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

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 金门县| 峨眉山市| 石狮市| 灵寿县| 蕲春县| 邹平县| 平陆县| 比如县| 三门县| 北宁市| 武隆县| 中阳县| 玉林市| 四川省| 大方县| 竹北市| 德安县| 蚌埠市| 闵行区| 泰来县| 崇信县| 日土县| 贵定县| 利津县| 平乡县| 富宁县| 崇信县| 泰宁县| 精河县| 河南省| 湘西| 通山县| 屏边| 湖南省| 厦门市| 博乐市| 顺义区| 望奎县| 阜新| 迭部县| 博客|