作用:
雖然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