天天看點

JavaEE-JSP基礎-自定義标簽1.傳統标簽2.簡單标簽

作用:
雖然JSTL标準标簽庫提供了很多通用标簽,
但實際開發需求複雜多變,
這些通用标簽是不能完全在JSP頁面替代java代碼,
是以需要我們自定義标簽來替代java代碼!
           

1.傳統标簽

1).原理

Tag接口       
    |---IterationTag接口
        |---TagSupport類--
        |---BodyTag接口  |
                BodyTagSupprot類

Tag生命周期:
第一次使用時建立執行個體,從此駐留記憶體重複利用,每次都會依次執行:
setPageContext(PageContext pc) 傳入jsp對象
setParent(Tag t) 傳入父标簽
doStartTag() 通過傳回值來控制标簽體是否執行
doEndTag() 通過傳回值控制标簽後jsp頁面是否執行
release() 伺服器停止前調用銷毀對象
           

2).自定義步驟:

1).編寫一個類實作Tag接口
2).編寫一個tld檔案描述Tag類
3).在jsp頁面中引入tld檔案

傳統标簽自定義相當繁瑣,需分析開始标簽和結束标簽時,還需分析傳回标簽體控制程式,
一般不推薦使用,簡單标簽SimpleTag更友善開發!
           

2.簡單标簽

1).原理

SimpleTag接口
    |---SimpleTagSupport實作類

SimpleTag生命周期:
每次通路标簽時都建立簡單标簽對象,用完即銷毀。
setJspContext(JspContext pc) 傳入目前jsp的PageContext對象
setParent(JspTag parent) 若标簽有父标簽,則調用傳入
setXXX() 若标簽有屬性,則調用傳入
setJspBody(JspFragment jspBody) 若标簽有标簽體,則調用傳入
doTag() 處理标簽替代的java代碼
           

2).自定義步驟

1).編寫一個類繼承SimpleTagSupport,覆寫doTag(),調用getJspContext/getJspBody擷取JSP内容;
public class MyTag extends SimpleTagSupport {   
    @Override
    public void doTag(){            
        // 标簽體重複輸出
        for(int i=0;i<attr;i++)
            getJspBody().invoke(null);

    /*  // 預設會執行标簽後續JSP頁面
        // 抛出SkipPageException異常,不執行後續JSP頁面
        throw new SkipPageException();

        // 擷取标簽體
        StringWriter writer = new StringWriter();
        getJspBody().invoke(writer);
        String str = writer.toString(); 
        // 修改後輸出
        getJspContext().getOut().write(str.toUpperCase()); */
    }

    // 自定義标簽屬性attr
    private int attr;   
    public void setAttr(int attr) {
        this.attr = attr;
    }
}

2).在WEB-INF目錄下編寫一個tld檔案,描述自定義SimpleTag類;
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" 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">
    <tlib-version>1.0</tlib-version>
    <short-name>MyTag</short-name>
    <uri>http://www.xxx.com/MyTag</uri>
    <tag>
        <name>myTag</name> 标簽名
        <tag-class>com.xx.MyTag</tag-class> 标簽處理類           
        <body-content>scriptless/empty</body-content>
                    scriptless不能含Java腳本代碼
                    empty代表隻能為空         
                    tagdependent不會輸出到浏覽器
                    JSP代表任意内容,不能在簡單标簽使用,隻能在傳統标簽使用

        <attribute> 聲明屬性
            <name>attr</name> 屬性名
            <required>true</required> 是否為必須存在
            <rtexprvalue>true</rtexprvalue> 是否支援EL表達式
            <type>int</type> 屬性java類型
        </attribute>
    </tag>
</taglib>       

3).在jsp頁面中引入tld檔案,使用自定義标簽
    <%@ taglib uri="http://www.xxx.com/MyTag" prefix="MyTag"%>
    <MyTag:myTag attr="10">循環輸出文本</MyTag:myTag>
           

簡書: http://www.jianshu.com/p/55afd8a45a02

CSDN部落格: http://blog.csdn.net/qq_32115439/article/details/54695126

GitHub部落格:http://lioil.win/2017/01/23/JSP-MyTag.html

Coding部落格:http://c.lioil.win/2017/01/23/JSP-MyTag.html