2015年9月27日 星期日

空標籤 (客製化JSP Tag 一)

※無屬性Tag

EmptyTag.java
public class EmptyTag extends TagSupport {
    @Override
    public int doStartTag() throws JspException {
        try {
            pageContext.getOut().println("<h1>tag success</h1>");
        } catch (IOException e) {
            e.printStackTrace();
        }
        // return TagSupport.SKIP_BODY
        return super.doStartTag();
    }
}

要繼承TagSupport並覆寫doStartTag()

 helloTag.tld
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd">
    <tlib-version>1.0</tlib-version>
    <short-name>ht</short-name>
    
    <tag>
        <name>helloTag</name>
        <tag-class>empty.EmptyTag</tag-class>
        <body-content>empty</body-content>
    </tag>
</taglib>

tld可以安裝jboss tools,它可以幫助產生taglib裡面的屬性,short-name必填

 empty.jsp
<%@taglib uri="WEB-INF/helloTag.tld" prefix="bruce" %>
<body>
    <bruce:helloTag />
</body>

※prefix寫什麼就用什麼開頭,「:」後面是tld有個tag,裡面的name
這樣就可以產生一個自訂的空標籤了

※因為是空標籤,所以<bruce:helloTag></bruce:helloTag>裡面不能放東西

※還可以配合web.xml使用,這樣uri就不用指定路徑了,只要指定web.xml的taglib-uri即可
web.xml
<jsp-config>
    <taglib>
        <taglib-uri>http://javabruce.blogspot.tw/empty</taglib-uri>
        <taglib-location>/WEB-INF/helloTag.tld</taglib-location>
    </taglib>
</jsp-config>

由web.xml連接tld,uri可以隨便打
而jsp的taglib,uri就要改成隨便打的字,如下:
<%@taglib uri="http://javabruce.blogspot.tw/empty" prefix="bruce" %>

※有屬性Tag

做一個數字格式化的範例
AttrTag.java
public class AttrTag extends TagSupport {
    private String format;
    private Double dou;
    public void setFormat(String format) {
        this.format = format;
    }
    public void setDou(Double dou) {
        this.dou = dou;
    }

    @Override
    public int doStartTag() throws JspException {
        NumberFormat formatter = new DecimalFormat(this.format);
        try {
            pageContext.getOut().write(formatter.format(dou));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return super.doStartTag();
    }
}

只要給setter就可以了

 attr.tld
<tag>
    <name>displayNumber</name>
    <tag-class>attr.AttrTag</tag-class>
    <body-content>empty</body-content>
    <attribute>
        <name>format</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <name>dou</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
</tag>

attr.jsp
<%@taglib uri="http://javabruce.blogspot.tw/attr" prefix="bruce" %>
<bruce:displayNumber dou="12345.6789" format="#,###,###.###"/>

attribute的name會找到對應的setter

 web.xml
<jsp-config>
    <taglib>
        <taglib-uri>http://javabruce.blogspot.tw/empty</taglib-uri>
        <taglib-location>/WEB-INF/helloTag.tld</taglib-location>
    </taglib>
    <taglib>
        <taglib-uri>http://javabruce.blogspot.tw/attr</taglib-uri>
        <taglib-location>/WEB-INF/attr.tld</taglib-location>
    </taglib>
</jsp-config>

這裡的web.xml連剛剛的無屬性Tag一起show出來
我用兩個jsp-config會變成404,所以看起來只能有一個jsp-config,然後對應多個taglib
可以參考這個網站

tld的required是true,表示用此標籤時,一定要加這個屬性
rtexprvalue是true時,支援表達式語言,如下:
<%
    pageContext.setAttribute("d", 54321.87654d);
    String f = "#,###,###.###";
%>
<bruce:displayNumber dou="${d}" format="<%=f%>"/>

${}就是表達式語言,<%=%>就不是,所以為false時,就會出500,According to TLD or attribute directive in tag file, attribute xxx does not accept any expressions


沒有留言:

張貼留言