2016-03-22 58 views
0

我試圖創建一個自定義TLD具有以下格式我的春節,3基於應用程序:定製JSP TLD同時涉及的屬性和元素

<prefix:mytag attribute1="myvalue"> 
    <element>abcd</element> 
    <element>abcd</element> 
    <action>cancel</action> 
</prefix:mytag> 

對於這個我伸出javax.servlet.jsp.tagext。 BodyTagSupport並定義屬性屬性1但我該如何定義元素?

我TLD是如下:

<tag> 
    <description>My custom TLD</description> 
    <name>mytag</name> 
    <tag-class>mypackage.MyCustomTLD</tag-class> 
    <attribute> 
     <description>Hold Attribute</description> 
     <name>attribute1</name> 
     <required>false</required> 
     <rtexprvalue>true</rtexprvalue> 
    </attribute> 
</tag> 

回答

1

您不能定義標籤的元素,它們被認爲是獨立的標籤。

您還需要爲每個子元素定義標籤。這是一個例子。

<app:paramGroup id="edit"> 
    <app:param id="name" value="attribute"/> 
    <app:param id="attId" name="attForm" property="id"/> 
</app:paramGroup> 

爲了實現上述功能,您需要定義兩個標籤。

<tag> 
    <name>paramGroup</name> 
    <tagclass>com.mycompany.taglib.ParamGroupTag</tagclass> 
    <info> 
     Param Group Tag used to define the parameters group required for the struts html link 
    </info> 

    <attribute> 
     <name>id</name> 
     <required>true</required> 
     <rtexprvalue>true</rtexprvalue> 
    </attribute> 
</tag> 


<tag> 
    <name>param</name> 
    <tagclass>com.mycompany.taglib.ParamTag</tagclass> 

    <bodycontent>empty</bodycontent> 

    <attribute> 
     <name>id</name> 
     <required>true</required> 
     <rtexprvalue>true</rtexprvalue> 
    </attribute> 

    <attribute> 
     <name>name</name> 
     <required>false</required> 
     <rtexprvalue>true</rtexprvalue> 
    </attribute> 
</tag> 

這裏是標記類,父標記實例應該發佈到上下文,以便子標記可以與父項進行交互。

public class ParamGroupTag extends BodyTagSupport { 

    public static final String NAME = "com.mycompany.taglib.ParamGroupTag"; 

    public int doStartTag() throws JspException { 

     boolean exist = false; 

     params = new HashMap(); 

     // your initialization code 

     // Store this tag itself as a page attribute 
     pageContext.setAttribute(ParamGroupTag.NAME, this); 

     // Continue processing this page 
     return (EVAL_BODY_BUFFERED); 
    } 

    /** 
    * Adds the paramter this param object 
    * @param paramName Parameter Name 
    * @param value  Parameter Value 
    */ 
    public void addParam(String paramName, Object value) { 
     params.put(paramName, value); 
    } 

    /** 
    * Clean up the Tag. 
    * 
    * @exception JspException if a JSP exception has occurred 
    */ 
    public int doEndTag() throws JspException { 

     // tag functionality here 

     // Remove the Tag from pageContext 
     pageContext.removeAttribute(ParamGroupTag.NAME); 

     // Continue processing this page 
     return (EVAL_PAGE); 
    } 

} 


public class ParamTag extends BodyTagSupport { 

    /** 
    * Reads the Params and Publishes to ParamGroup 
    * 
    * @exception JspException if a JSP exception has occurred 
    */ 
    public int doStartTag() throws JspException { 

     ParamGroupTag paramGroupTag = (ParamGroupTag) 
        pageContext.getAttribute(ParamGroupTag.NAME); 

     if (paramGroupTag == null) { 
      throw new JspException("ParamTag must be used with in ParamGroup Tag"); 
     } 

     // read the attribtues 

     paramGroupTag.addParam(id, value); 

     // Continue processing this page 
     return (EVAL_PAGE); 
    } 
} 
+0

爲什麼你在endTag而不是doStartTag()? –

+0

那你不需要。你可以在doStartTag中做到這一點。我從我的一個標籤源複製它,它需要讀取標籤的主體,所以這就是爲什麼我在endTag中做到了。但是,你可以在doStartTag中做到這一點。 – JChap

+0

我明白了。感謝您的答覆 ! –

相關問題