隨筆-124  評論-49  文章-56  trackbacks-0
          Struts2 的UITag原理:
          Struts2 UITag分三部份組成,一部份用于定義Tag的內容與邏輯的UIBean,一部份用于定義JSP Tag,也就是平時我們定義的那種,最后就是Template,它存放在你的theme目錄之下,是一個FreeMarker模板文件。

          我現在輯寫一份MMTag,它主要是用于輸出帶鏈接的文字,比如像這樣:
          <cur:mm message="'I am a boy.'" />
          就會輸出:
          <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會自動在后面加入.ftl擴展名以找到特定的模板文件。
          * setXXX,設置UIBean的屬性,一般Tag中有幾個這樣的屬性,這里就有幾個。@StrutsTagAttribute(description="set message", type="String") 注解,說明該屬性是字符串(也可以是其它),這一步很重要。
          * 覆寫evaluateExtraParams() 方法,在UIBean初始化后會調用這個方法來初始化設定參數,如addParameter方法,會在freemarker里的parameters里加 入一個key value。這里要注意findString,還有相關的findxxxx方法,它們是已經封裝好了的解釋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()初始化參數,一般用來初始化UIBean(Component)。
          * setXXXX設置屬性,和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目錄(這個目錄名和你的theme有關),然后在里面建一個 mm.ftl文件:

          <href="http://www.yinsha.com">${parameters.message?html}</a>


          建一個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: 寫得有些粗鄙,所以,如有問題的,可以留言。

           

           

           

          http://devilkirin.javaeye.com/blog/427395

          http://xiaojianhx.javaeye.com/blog/482888
          posted on 2011-05-30 21:43 junly 閱讀(1127) 評論(1)  編輯  收藏 所屬分類: struts2/struts1.3/JSF

          評論:
          # re: Struts2 自定義標簽的方法[未登錄] 2014-04-03 10:12 |
          我自己寫了一個自定義標簽,但是我現在需要一個擴展struts2的自定義標簽,找到好久還是沒有頭緒,急需賜教,如方便,請加2359428382。多謝。
            回復  更多評論
            
          主站蜘蛛池模板: 江阴市| 吉木萨尔县| 礼泉县| 龙门县| 惠东县| 石屏县| 青铜峡市| 秦安县| 贵阳市| 那曲县| 罗田县| 太仆寺旗| 富蕴县| 茶陵县| 玛纳斯县| 东海县| 修武县| 石屏县| 屏边| 汤原县| 上栗县| 卢湾区| 桐城市| 滕州市| 贵溪市| 翁牛特旗| 图们市| 临江市| 民乐县| 长岛县| 民和| 临湘市| 上虞市| 元谋县| 绥化市| 九龙县| 丰台区| 湖南省| 清镇市| 沽源县| 吉水县|