自定義標(biāo)簽可以實(shí)現(xiàn)的功能:
- 移除jsp中的java代碼
- 控制jsp中的某段程序是否執(zhí)行
- 控制jsp頁面中的所有內(nèi)容是否執(zhí)行
- 控制jsp中的程序重復(fù)執(zhí)行
- 修給jsp中的內(nèi)容郁油。
傳統(tǒng)標(biāo)簽庫 總結(jié):
創(chuàng)建傳統(tǒng)標(biāo)簽
- 創(chuàng)建jsp標(biāo)簽類繼承
TagSupport
類。 - 重寫
doStartTag()
方法攀痊,在doStartTag()
方法中書寫程序,此方法在執(zhí)行開始標(biāo)簽的時(shí)候被服務(wù)器調(diào)用桐腌。服務(wù)器在遇到標(biāo)簽的時(shí)候先調(diào)用tag類的setPageContext(pageContext)
方法將pageContext類傳遞進(jìn)去。 - 在WEB-INF下創(chuàng)建tld文件,在文件中對標(biāo)簽進(jìn)行配置蟆盐。
<?xml version="1.0" encoding="UTF-8" ?>
<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>SimpleTagLibrary</short-name>
//將此標(biāo)簽綁定的uri,通過此uri引用標(biāo)簽
<uri>http://www.baixinping.com</uri>
<tag>
<description>Outputs Hello, World</description>
//引用時(shí)的名稱
<name>ha</name>
//標(biāo)簽類的目錄
<tag-class>baixinping.tag.Ha</tag-class>
//標(biāo)簽體中是否有內(nèi)容
<body-content>empty</body-content>
</tag>
</taglib>
- 使用:
<%@ taglib uri="http://www.baixinping.com" prefix="ha" %>
控制jsp中的某段程序的輸出:
1、繼承TagSupport
2、重寫doStartTag();
3脖镀、如果doStartTag()
返回TagSupport.SKIP_BODY
,則不執(zhí)行標(biāo)簽體中的內(nèi)容肩碟,如果返回的是TagSupport.EVAL_BODY_INCLUDE
則執(zhí)行標(biāo)簽體中的內(nèi)容。
控制jsp頁面是否執(zhí)行咙崎。
- 繼承
TagSupport
- 重寫
doEndStart()
- 如果
doEndTag()
返回TagSupport.SKIP_PAGE
,則不執(zhí)行余下的jsp中的內(nèi)容伊滋。如果返回TagSupport.EVAL_PAGE
,則繼續(xù)執(zhí)行余下的內(nèi)容。
控制部分代碼重復(fù)執(zhí)行
- 繼承繼承
TagSupport
- 重寫
doAfterBody()
方法,此方法在執(zhí)行完標(biāo)簽體中的內(nèi)容之后執(zhí)行。 - 如果
doAfterBody()
方法返回TagSupport.EVAL_BODY_AGAIN
,則繼續(xù)執(zhí)行標(biāo)簽體中的內(nèi)容使兔。如果返回TagSupport.SKIP_BODY
則繼續(xù)執(zhí)行doEndTag()
方法置蜀。
修改jsp中的內(nèi)容
- 繼承
BodyTagSupport
。此類在執(zhí)行完doStartTag()
完之后會自動執(zhí)行setBodyContent()
方法將標(biāo)簽體中的內(nèi)容傳遞給標(biāo)簽類秋秤。然后執(zhí)行doEndTag
方法来农。 - 在
doEndTag()
方法中通過this.getBodyContent()
獲取標(biāo)簽體內(nèi)容對象涩咖,然后對其進(jìn)行修改即可咨演。
簡單標(biāo)簽庫使用 總結(jié):
繼承SimpleTagSupport
。tld文件中聲明有標(biāo)簽體使用<body-content>scriptless</body-content>
嵌牺,意思是標(biāo)簽體中不能有腳本代碼(java程序)
簡單標(biāo)簽執(zhí)行步驟(原理):
- 遇到簡單標(biāo)簽之后,先實(shí)例化標(biāo)簽類阿浓。
- 調(diào)用
setJspContext()
將pageContexr()
將jsp頁面對象傳遞過來退敦。 - 調(diào)用
setParent()
方法將標(biāo)簽的父標(biāo)簽傳遞過來翰铡,如果沒有父標(biāo)簽傳遞null. - 調(diào)用
setJspBody()
將封裝了標(biāo)簽體內(nèi)容的JspFragment
對象傳遞過來。 - 執(zhí)行標(biāo)簽(調(diào)用
doTag()
方法),控制標(biāo)簽之后的內(nèi)容不被執(zhí)行,只需要拋出new SkipPageException()
即可。
JspFragment content = this.getJspBody();
content.invoke(this.getJspContext().getOut());
使用invoke()方法將內(nèi)容寫入對應(yīng)的流緩沖區(qū)中。 - 垃圾回收器回收標(biāo)簽對象(在傳統(tǒng)標(biāo)簽中,標(biāo)簽對象會駐留在內(nèi)存中繼續(xù)服務(wù)之后的調(diào)用)
標(biāo)簽定義屬性:
- 在標(biāo)簽類中創(chuàng)建屬性值,并創(chuàng)建set方法慢蜓。
- 在tld文件中聲明屬性则剃。
<tag>
<description>Outputs Hello, World</description>
<name>test6</name>
<tag-class>baixinping.tag.Test6</tag-class>
<body-content>scriptless</body-content>
<attribute>
//屬性名
<name>count</name>
//屬性是否必須
<required>true</required>
//屬性值是否可以使用表達(dá)式
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
注意:set方法會自動有服務(wù)器調(diào)用忍级,服務(wù)器賦值只能夠進(jìn)行8中基本數(shù)據(jù)類型轉(zhuǎn)換帆谍。若是復(fù)雜類型,則在jsp頁面中使用表達(dá)式戈稿。