標籤:分享 頁面 比較 自訂 script img desc blog 動態
分兩個版本,JSP 1.X版和JSP 2.X版。還有一個比較簡單的自訂函數。
一、JSP 1.X
1. 基礎版:實現Tag介面
流程如下
寫好了類之後還要在tld檔案中進行配置。tld檔案可以放在web-inf下面,這樣會被自動載入到。
如果不位於web-inf下面,要在web.xml中指定一下位置
<jsp-config> <taglib> <taglib-uri>xxx</taglib-uri> <taglib-location>xxx</taglib-location> </taglib></jsp-config>
<?xml version="1.0" encoding="UTF-8" ?><taglib .....><taglibversion>1.0</taglibversion><jspversion>1.1</jspversion><shortname>xxx</shortname><uri>xxxxxxx</uri><info>xxxx</info><tag> <name>xxx</name> <tagclass>xxx</tagclass> <bodycontent>xxx</bodycontent> <info>xxx</info> <attribute> <name>xxx</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute></tag></taglib>
bodycontent有三種取值,empty:不允許有標籤體存在, JSP:允許有標籤體存在,可以為JSP代碼, tagdependent:允許有標籤體存在,但標籤體內的代碼不會被執行。
2. 進階版:繼承TagSupport類
已經有了 個預設的流程,只要實現doStartTag()和doEndTag()就可以了。
如果標籤帶參數(屬性),只需通過setter方法將屬性注入即可,屬性需要在tld檔案中聲明,如上面所寫。
rtexprvalue指明是否允許EL運算式或者Scriptlet<%= %>。如果帶多個參數,就設定多個setter方法,同時在tld檔案中進行相關配置。
3:帶標籤體:通過BodyTag或者BodyTagSupport。
流程如下:
其中BodyTagSupport已經有了個預設的流程,會按照中間的線一直走。
如果想要標籤體被多次執行,可以控制doAfterBody()的傳回值。doAfterBody方法內的輸出是寫入到bodyContent緩衝中的,因此每次通過getBodyContent取出的的值會包括以前的全部輸出。
4:帶動態屬性:還需實現DynamicAttributes介面,並實現該介面的setDynamicAttribute方法,把動態屬性儲存起來。
需要在tld檔案中進行設定,在tag標籤中加上
<dynamic-attributes>true</dynamic-attributes>
5:嵌套的自訂標籤
下層標籤可以通過getParent方法擷取上層標籤的對象,通過其getter,setter方法擷取其屬性。父標籤則可以通過getBodyContent在標籤體執行結束後擷取標籤體的內容。或者子標籤將相關資料通過父標籤的getter,setter方法傳給父標籤。
二、JSP 2.X
實現SimpleTag介面,實現doTag方法,同時支援參數和標籤體。使用時一般會繼承SimpleTagSupport類。
doTag內通過getJspContext().getOut()擷取out對象。
如果帶標籤體,通過getJspBody擷取標籤體,返回對象是一個JspFragment, 調用jspFragment.invoke(Writer)方法將內容寫到相應輸出中,writer為null時寫到頁面。
此時的tld檔案要做相關改變,bodycontent變為tagdependent
如果帶多個標籤體,需要藉助jsp:attribute標籤。
<taglib:multiAttribute> <jsp:attribute name="xxx">xxxx</jsp:attribute> <jsp:attribute name="xxx">xxxx</jsp:attribute></taglib:multiAttribute>
這樣在類中要設定兩個屬性,類型為JspFragment。在tld檔案中對屬性進行設定。去掉rtexprvalue,增加
<fragment>true</fragment>
三、自訂函數
1. 寫一個函數類,裡面添加要自訂的靜態方法。
2. 在tld檔案中對函數進行描述。
<function> <description>xxx</description> <name>xxx</name> <function-class>xxx</function-class> <function-signature>xxx</function-signature> <example>xxx</example></function>
function-signature即類似 java.lang.String substring(java.lang.String, int)的傳回值全類名 方法名(參數全類名...),如果為數組,列表之類還要加上L
JSP自訂標籤