※無屬性Tag
EmptyTag.javapublic 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
沒有留言:
張貼留言