作用:
雖然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
getJspBody().invoke(null);
}
// 自定義标簽屬性attr
private int attr;
public void setAttr(int attr) {
this.attr = attr;
}
}
2).在WEB-INF目錄下編寫一個tld檔案,描述自定義SimpleTag類;
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">
1.0
MyTag
http://www.xxx.com/MyTag
myTag 标簽名
com.xx.MyTag 标簽處理類
scriptless/empty
scriptless不能含Java腳本代碼
empty代表隻能為空
tagdependent不會輸出到浏覽器
JSP代表任意内容,不能在簡單标簽使用,隻能在傳統标簽使用
聲明屬性
attr 屬性名
true 是否為必須存在
true 是否支援EL表達式
int 屬性java類型
3).在jsp頁面中引入tld檔案,使用自定義标簽
循環輸出文本