jsp自定義標籤

  你能夠不去造輪子,可是你得知道輪子怎麼造。html

  Javaweb實現自定義標籤:將方法封裝到自定義標籤處理類中,而後使用方法與JSTL標籤一致。在實際開發中,前臺頁面是不容許html代碼和java代碼相混合的,但有時jsp或第三方爲咱們提供的標籤知足不了需求,這時須要經過本身將業務邏輯封裝到繼承jsp規範的類或接口的處理類中來定義標籤,這就是所謂的自定義標籤。這樣的缺點是加劇了工做量。但與前端人員溝通和後期的維護上來看,這點工做是微不足道的。前端

  1. 建立一個類,如TimeTag,繼承TagSupport類。爲自定義標籤添加屬性,須要再java類中建立對應屬性,並實現set方法,在後面的tld註冊是,爲tag標籤添加attribute
  2. WEB-INF下建立一個tld的文件。這是一個標籤庫文件,咱們所定義的標籤都要在這個tld文件中進行註冊。這個tld文件能夠在tomcat安裝目錄下的webapps\examples\WEB-INF\jsp中找到。

如:java

<?xml version="1.0" encoding="ISO-8859-1" ?>
<taglib>
    <tlib-version>1.0</tlib-version>
    <jsp-version>1.2</jsp-version>
    <short-name>lzqTag</short-name>
    <uri>/lzqTag</uri>
    <description>
        這是一個標籤庫
    </description>
    <tag>
        <name>time</name>
        <tag-class>com.lzq.tag.TimeTag</tag-class>
        <body-content>empty</body-content>
<!--
body-content標籤有4個值:empty,JSP,scriptless,tagdependent:
1.empty:它是一個空的標籤體。
2.JSP:是容許標籤體內出現JSP腳本,也就是java代碼。
3.scriptless:能夠接受文本,EL表達式,和JSP的動做。
4.tagdependent:它是指在標籤體的內容能夠直接被寫入bodyContent,由自定義標籤處理類來處理,而不被JSP容器所解析。
-->
        <description>
            Perform a server side action; Log the message.
        </description>
        <attribute>
            <name>str</name>
            <required>true</required>
        </attribute>
    </tag>
</taglib>

 

  3.jsp中引入標籤庫,如:<%@ taglib prefix="lzqtag" uri="/lzqTag" %>,並在body中使用<lzqtag:time str=’’ />web

 

 

 

Tag接口:tomcat

int SKIP_BODY = 0;    // 跳過標籤體,不執行標籤體的內容
int EVAL_BODY_INCLUDE = 1;    // 執行自定義標籤的標籤體
int SKIP_PAGE = 5;    // 告訴web容器忽略標籤後面的內容
int EVAL_PAGE = 6;    // 告訴web容器繼續執行標籤後面的代碼

// 在jsp運行過程當中,碰見自定義標籤後,執行的方法:返回常量SKIP_BODY、EVAL_BODY_INCLUDE
int doStartTag() throws JspException;

// 在執行標籤的結束標誌後,執行該方法:返回常量SKIP_PAGE、EVAL_PAGE
int doEndTag() throws JspException;

 

IterationTag接口:app

int EVAL_BODY_AGAIN = 2;    // 
// 提供了對標籤內容循環的功能:返回EVAL_BODY_AGAIN,一直循環,知道返回常量SKIP_BODY、EVAL_BODY_INCLUDE
int doAfterBody() throws JspException;

 

 

SimpleTag接口:less

在源碼中能夠看到SimpleTag接口有5個方法,webapp

一、doTag()方法是核心方法,咱們能夠將全部的標籤處理邏輯都寫在這個方法中,這個方法會拋出一個JspException,而後咱們能夠經過這個異常通知WEB容器,再也不執行此標籤後面的內容。jsp

二、setParent(JspTag),這個方法呢,由WEB容器所調用的,是將父標籤處理器對象傳遞給標籤處理器。ide

三、getParent()是獲取當前標籤的父標籤對象,好比在標籤嵌套時,能夠用此方法獲得當前標籤的父標籤。

四、setJSPContext(JspContext)這個方法也是由容器調用的,這個方法是將JSP頁面中的pageContext對象傳遞給標籤處理器對象。

五、setJspBody(JspFragment)這個方法也由web容器調用,意思是將表明當前標籤體的JspFragment對象傳遞給標籤處理器對象,這裏的參數能夠理解爲標籤體的內容。

 注意:JSP引擎在處理簡單標籤的標籤時,會將標籤體中的內容封裝到JspFragment這個參數中,並調用setJspBody(JspFragment)將該對象傳遞給標籤處理器,咱們就能夠根據需求來控制是否輸出標籤體或者循環標籤體。

相關文章
相關標籤/搜索