1. 程式人生 > >Web開發之-JSP學習總結-第四篇:自定義標籤總結

Web開發之-JSP學習總結-第四篇:自定義標籤總結

一、自定義標籤開發步驟—以高仿<c:if test=""></c:if>標籤為例

1、編寫一個普通的java類,繼承SimpleTagSupport類,叫標籤處理器類。並且覆蓋doTag方法

/**
 * 標籤處理器類
 * 1)繼承SimpleTagSupport
 */
public class IfTag extends SimpleTagSupport {
    private boolean test;

    public void setTest(boolean test) {
        this.test = test;
    }
    /**
     * 2)覆蓋doTag方法
     */
@Override public void doTag() throws JspException, IOException { //根據test的返回值決定是否輸出標籤體內容 if(test){ this.getJspBody().invoke(null); } } }

2、在web專案的WEB-INF目錄下建立xxx.tld檔案,這個tld叫標籤庫的宣告檔案。(參考核心標籤庫的tld檔案)

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

<taglib
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" version="2.1">
<!-- 標籤庫的版本 --> <tlib-version>1.1</tlib-version> <!-- 標籤庫字首 -->
<short-name>lwb</short-name> <!-- tld檔案的唯一標記 --> <uri>http://blog.csdn.net/learning_lu</uri> <!-- 一個標籤的宣告 --> <tag> <!-- 標籤名稱 --> <name>if</name> <!-- 標籤處理類的全名 --> <tag-class>lwb.tag.IfTag</tag-class> <!-- 輸出標籤體的內容格式 --> <body-content>scriptless</body-content> <!-- 屬性宣告 --> <attribute> <name>test</name> <!-- 是否必填 --> <required>true</required> <!-- 是否支援EL表示式 --> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>

3、在jsp頁面的頭部匯入自定義標籤庫
<%@taglib uri="http://blog.csdn.net/learning_lu" prefix="lwb"%>
4、在jsp中使用自定義標籤

<itcast:if test="${2}">
        條件成立
    </itcast:if>

二、自定義標籤的執行過程

      tomcat伺服器啟動時,載入到每個web應用,載入每個web應用的WEB-INF目錄下的所有檔案!!!例如。web.xml, tld檔案!!!
      1、訪問XXX.jsp資源
      2、tomcat伺服器把jsp檔案翻譯成java原始檔->編譯class->構造類物件->呼叫_jspService()方法
      3、檢查jsp檔案的taglib指令,是否存在一個名為http://blog.csdn.net/learning_lu的tld檔案。如果沒有,則報錯
      4、上一步已經讀到xxx.tld檔案(自定義標籤庫檔案)
      5、讀到<lwb:if test=""> 到xxx.tld檔案中查詢是否存在<name>為if的這裡寫<tag>標籤
      6、找到對應的<tag>標籤,則讀到<tag-class>片內容
      7、得到 lwb.tag.IfTag
      構造ShowIpTag物件,然後呼叫IfTag裡面的方法

三、自定義標籤處理器類的生命週期

SimpleTag介面:

void    setJspContext(JspContext pc)  
        --設定pageContext物件,傳入pageContext(一定呼叫)、通過getJspCotext()方法得到pageContext物件
void    setParent(JspTag parent)  
        --設定父標籤物件,傳入父標籤物件,如果沒有父標籤,則不呼叫此方法。通過getParent()方法得到父標籤物件。
void    setXXX(值)             
        --設定屬性值。
void    setJspBody(JspFragment jspBody) 
        --設定標籤體內容。標籤體內容封裝到JspFragment物件中,然後傳入JspFragment物件。
          通過getJspBody()方法得到標籤體內容。如果沒有標籤體內容,則不會呼叫此方法
void    doTag()                     
        --執行標籤時呼叫的方法。(一定呼叫)

四、自定義標籤的作用

        1)控制標籤體內容是否輸出
        2)控制標籤餘下內容是否輸出
        3)控制重複輸出標籤體內容
        4)改變標籤體內容
        5)帶屬性的標籤