自定義標籤簡介

 

自定義標籤簡介

一、自定義標籤主要用於移除Jsp頁面中的java代碼

移除jsp頁面中的java代碼,只需要完成兩個步驟:

       編寫一個實現Tag接口的Java類,並覆蓋doStartTag方法,把jsp中的java代碼定到doStartTag方法中。

       編寫標籤庫描述符(tld)文件,在tld文件中對自定義標籤進行描述。

       完成以上操作,即可在JSP頁面中導入和使用自定義標籤。

 

<%   %>

<dhw:viewIP/>

自定義標籤的創建步驟:

(1)標籤處理器——java類,實現Tag接口

(2)創建一個.tld文件

JSP頁面中作用自定義標籤

       <hbsi:viewIP>

              ..................

       </hbsi:viewIP>

 

<?xml version="1.0" encoding="UTF-8" ?>

<!--

 Licensed to the Apache Software Foundation (ASF) under one or more

  contributor license agreements.  See the NOTICE file distributed with

  this work for additional information regarding copyright ownership.

  The ASF licenses this file to You under the Apache License, Version 2.0

  (the "License"); you may not use this file except in compliance with

  the License.  You may obtain a copy of the License at

 

      http://www.apache.org/licenses/LICENSE-2.0

 

  Unless required by applicable law or agreed to in writing, software

  distributed under the License is distributed on an "AS IS" BASIS,

  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

  See the License for the specific language governing permissions and

  limitations under the License.

-->

 

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"

    version="2.0">

    <description>A tag library exercising SimpleTag handlers.</description>

    <tlib-version>1.0</tlib-version>

    <short-name>hbsi</short-name>

    <uri>http://www.hbsi.edu.cn</uri>

    <tag>

   

        <name>viewIP</name>

    <tag-class>com.hbsi.web.tag.CusTagDemo1</tag-class>

    <body-content>empty</body-content>

    </tag> 

</taglib>

 

this.pageContext.getOut()  getSession()  getRequest()

<%@page

<%@include

%@taglib uri=”http://www.hbsi.edu.cn” prefix=”hbsi”%

二、Tag接口的執行流程

(1)通過doStartTag()的返回值決定是否處理標籤體內容

返回值兩個:Tag.EVAL_BODY_INCLUDE   Tag.SKIP_BODY

(2)通過doEndTag()的返回值決定是否繼續處理jsp頁面中該自定義標籤

返回值兩個:Tag.EVAL_PAGE    Tag.SKIP_PAGE

JSP引擎將遇到自定義標籤時,首先創建標籤處理器類的實例對象,然後按照JSP規範定義的通信規則依次調用它的方法。

       1、public void setPageContext(PageContext pc), JSP引擎實例化標籤處理器後,將調用setPageContext方法將JSP頁面的pageContext對象傳遞給標籤處理器,標籤處理器以後可以通過這個pageContext對象與JSP頁面進行通信。

       2、public void setParent(Tag t),setPageContext方法執行完後,WEB容器接着調用的setParent方法將當前標籤的父標籤傳遞給當前標籤處理器,如果當前標籤沒有父標籤,則傳遞給setParent方法的參數值爲null。

       3、public int doStartTag(),調用了setPageContext方法和setParent方法之後,WEB容器執行到自定義標籤的開始標記時,就會調用標籤處理器的doStartTag方法。

       4、public int doEndTag(),WEB容器執行完自定義標籤的標籤體後,就會接着去執行自定義標籤的結束標記,此時,WEB容器會去調用標籤處理器的doEndTag方法。

       5、public void release(),通常WEB容器執行完自定義標籤後,標籤處理器會駐留在內存中,爲其它請求服務器,直至停止web應用時,web容器纔會調用release方法。

三、自定義標籤功能擴展

1、自定義標籤除了可以移除Jsp頁面中的java代碼外,它還可以用於完成一些頁面邏輯例如:

通過自定義標籤可以控制jsp頁面某一部分內容是否執行。          例如:<c:if>標籤

通過自定義標籤可以控制標籤後的jsp頁面是否執行。

通過自定義標籤可以控制jsp頁面某一部分內容重複執行。          例如:<c:foreach>標籤

通過自定義標籤可以修改jsp頁面內容輸出。

   2、tld文件中的四種標籤體類型   EMPTY  JSP  scriptless  tagdepentend

初始化工作:

1)      將標籤處理器實例化成對象

2)      調用標籤處理器對象的setPageContext()將jsp頁面的pageContext對象

3)      調用標籤處理器對象setParent()將父標籤對象做參數傳遞給標籤處理器對象

4)調用doStartTag(),返回值決定是否要執行標籤體

5)標籤體的處理

6)調用doAfterBody()-----返回值可以決定是否要重複執行標籤體的內容

7)調用doEndTag()

 

 

<hbsi:demo5>   ---doStartTag()方法返回值   EVAL_BODY_BUFFERED

       This is my example    封裝在BodyContent對象  setBodyContent()

</hbsi:demo5>  ---doEndTag()  訪問BodyContext對象

四、簡單標籤

由於傳統標籤使用三個標籤接口來完成不同的功能,顯得過於繁瑣,不利於標籤技術的推廣,SUN公司爲降低標籤技術的學習難度,在JSP 2.0中定義了一個更爲簡單、便於編寫和調用 的SimpleTag接口的標籤通常稱爲簡單標籤。簡單標籤共定義 了5個方法:

setJspContext   setParent和getParent方法   setJspBody方法   doTag方法

1、SimpleTag方法介紹

setJspContext方法——用於把JSP頁面的pageContext對象傳遞給標籤處理器對象

setParent方法——用於把父標籤處理器對象傳遞給當前標籤處理器對象

getParent方法——用於獲得當前標籤的父標籤處理器對象

setJspBody方法——用於把代表標籤體的JspFragment對象傳遞給標籤處理器對象

doTag方法——用於完成所有的標籤邏輯,包括輸出、迭代、修改標籤體內容等。在doTag方法中可以拋出javax.servlet.jsp.SkipPageException異常,用於通知WEB容器不再執行JSP頁面中位於結束標記後面的內容,這等效於在傳統標籤的doEndTag方法中返回Tag.SKIP_PAGE常量的情況。

2、SimpleTag接口方法的執行順序

(1)當web容器開始執行標籤時,會調用如下方法完成標籤的初始化

WEB容器調用標籤處理器對象的setJspContext方法,將代表JSP頁面的pageContext對象傳遞給標籤處理器對象。

WEB容器調用標籤處理器對象的setParent方法,將父標籤處理器對象傳遞給這個標籤處理器對象。注意,只有在標籤存在父標籤的情況下,WEB容器纔會調用這個方法。

如果調用標籤時設置了屬性,容器將調用每個屬性對應的setter方法把屬性值傳遞給標籤處理器對象。如果標籤的屬性值是EL表達式或腳本表達式,則WEB容器首先計算表達式的值,然後把值傳遞給標籤處理器對象。

如果簡單標籤有標籤體,容器將調用setJspBody方法把代表標籤體的JspFragment對象傳遞進來。

(2)執行標籤時:容器調用標籤處理器的doTag()方法,開發人員在方法體內通過操作JspFragment對象,就可以實現是否執行、迭代、修改標籤體的目的。

 

 

發佈了66 篇原創文章 · 獲贊 15 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章