JSP自訂標籤

來源:互聯網
上載者:User

標籤:分享   頁面   比較   自訂   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自訂標籤

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.