javaweb学习6——自定义标签
聲明:本文只是自學(xué)過程中,記錄自己不會(huì)的知識(shí)點(diǎn)的摘要,如果想詳細(xì)學(xué)習(xí)JavaWeb,請(qǐng)到孤傲蒼狼博客學(xué)習(xí),JavaWeb學(xué)習(xí)點(diǎn)此跳轉(zhuǎn)
本文鏈接:https://www.cnblogs.com/xdp-gacl/p/3916946.html
? ? https://www.cnblogs.com/xdp-gacl/p/3916968.html
? ? ?https://www.cnblogs.com/xdp-gacl/p/3917714.html
傳統(tǒng)標(biāo)簽接口中的各個(gè)方法可以返回的返回值說明:
下圖列舉了Tag接口、IterationTag接口和BodyTag接口中的主要方法及它們分別可以返回的返回值的說明。
在JSP?API中也提供了IterationTag接口的默認(rèn)實(shí)現(xiàn)類TagSupport、IterationTag接口的默認(rèn)實(shí)現(xiàn)類TagSupport和BodyTag接口的實(shí)現(xiàn)類BodyTagSupport,我們?cè)诰帉懽远x標(biāo)簽的標(biāo)簽處理器類時(shí),可以繼承和擴(kuò)展TagSupport類、IterationSupport類和BodyTagSupport類。
開發(fā)簡單標(biāo)簽實(shí)現(xiàn)頁面邏輯
1.控制jsp頁面某一部分內(nèi)容是否執(zhí)行
編寫一個(gè)類繼承SimpleTagSupport,然后再重寫doTag方法,在doTag方法里面是否調(diào)用jspFrament.invoke方法來控制標(biāo)簽是否執(zhí)行。
package me.gacl.web.simpletag;import java.io.IOException;import javax.servlet.jsp.JspException; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.JspFragment; import javax.servlet.jsp.tagext.SimpleTagSupport;/*** @author gacl* SimpleTagSupport類實(shí)現(xiàn)了SimpleTag接口,* SampleTagDemo1類繼承SimpleTagSupport*/ public class SimpleTagDemo1 extends SimpleTagSupport {/* 簡單標(biāo)簽使用這個(gè)方法就可以完成所有的業(yè)務(wù)邏輯* @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag()* 重寫doTag方法,控制標(biāo)簽體是否執(zhí)行*/@Overridepublic void doTag() throws JspException, IOException {//得到代表jsp標(biāo)簽體的JspFragmentJspFragment jspFragment = this.getJspBody();//得到j(luò)sp頁面的的PageContext對(duì)象//PageContext pageContext = (PageContext) jspFragment.getJspContext();//調(diào)用JspWriter將標(biāo)簽體的內(nèi)容輸出到瀏覽器//jspFragment.invoke(pageContext.getOut());//將標(biāo)簽體的內(nèi)容輸出到瀏覽器jspFragment.invoke(null);} }2.控制jsp頁面內(nèi)容重復(fù)執(zhí)行
編寫一個(gè)類繼承SimpleTagSupport,然后再重寫doTag方法,在doTag方法里面重復(fù)調(diào)用jspFrament.invoke方法即可。
package me.gacl.web.simpletag;import java.io.IOException;import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.JspFragment; import javax.servlet.jsp.tagext.SimpleTagSupport;/*** @author gacl* SimpleTagSupport類實(shí)現(xiàn)了SimpleTag接口,* SampleTagDemo2類繼承SimpleTagSupport*/ public class SimpleTagDemo2 extends SimpleTagSupport {/* 簡單標(biāo)簽使用這個(gè)方法就可以完成所有的業(yè)務(wù)邏輯* @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag()* 重寫doTag方法,控制標(biāo)簽執(zhí)行5次*/@Overridepublic void doTag() throws JspException, IOException {// 得到代表jsp標(biāo)簽體的JspFragmentJspFragment jspFragment = this.getJspBody();for (int i = 0; i < 5; i++) {// 將標(biāo)簽體的內(nèi)容輸出到瀏覽器jspFragment.invoke(null);}} }3.修改jsp頁面內(nèi)容輸出
編寫一個(gè)類繼承SimpleTagSupport,然后再重寫doTag方法,在doTag方法調(diào)用jspFrament.invoke方法時(shí),讓執(zhí)行結(jié)果寫一個(gè)自定義的緩沖中即可,然后開發(fā)人員可以取出緩沖的數(shù)據(jù)修改輸出。
package me.gacl.web.simpletag;import java.io.IOException; import java.io.StringWriter;import javax.servlet.jsp.JspException; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.JspFragment; import javax.servlet.jsp.tagext.SimpleTagSupport;/*** @author gacl* SimpleTagSupport類實(shí)現(xiàn)了SimpleTag接口,* SampleTagDemo3類繼承SimpleTagSupport*/ public class SimpleTagDemo3 extends SimpleTagSupport {/* 簡單標(biāo)簽使用這個(gè)方法就可以完成所有的業(yè)務(wù)邏輯* @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag()* 重寫doTag方法,修改標(biāo)簽體里面的內(nèi)容,將標(biāo)簽體的內(nèi)容轉(zhuǎn)換成大寫*/@Overridepublic void doTag() throws JspException, IOException {// 得到代表jsp標(biāo)簽體的JspFragmentJspFragment jspFragment = this.getJspBody();StringWriter sw = new StringWriter();//將標(biāo)簽體的內(nèi)容寫入到sw流中 jspFragment.invoke(sw);//獲取sw流緩沖區(qū)的內(nèi)容String content = sw.getBuffer().toString();content = content.toUpperCase();PageContext pageContext = (PageContext) this.getJspContext();//將修改后的content輸出到瀏覽器中 pageContext.getOut().write(content);} }4.控制整個(gè)jsp頁面是否執(zhí)行
編寫一個(gè)類繼承SimpleTagSupport,然后再重寫doTag方法,在doTag方法拋出SkipPageException異常即可,jsp收到這個(gè)異常,將忽略標(biāo)簽余下jsp頁面的執(zhí)行。
示例代碼如下:
package me.gacl.web.simpletag;import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.SkipPageException; import javax.servlet.jsp.tagext.SimpleTagSupport;/*** @author gacl* SimpleTagSupport類實(shí)現(xiàn)了SimpleTag接口,* SampleTagDemo4類繼承SimpleTagSupport*/ public class SimpleTagDemo4 extends SimpleTagSupport {/* 簡單標(biāo)簽使用這個(gè)方法就可以完成所有的業(yè)務(wù)邏輯* @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag()* 重寫doTag方法,控制標(biāo)簽余下的Jsp不執(zhí)行*/@Overridepublic void doTag() throws JspException, IOException {//拋出一個(gè)SkipPageException異常就可以控制標(biāo)簽余下的Jsp不執(zhí)行throw new SkipPageException();} }tld文件中標(biāo)簽體類型設(shè)置細(xì)節(jié)
<tag><!-- 標(biāo)簽名 --><name>demo2</name><!-- 標(biāo)簽處理器類--><tag-class>me.gacl.web.simpletag.SimpleTagDemo2</tag-class><!-- 標(biāo)簽體允許的內(nèi)容 ,scriptless表示標(biāo)簽體的內(nèi)容不允許是java腳本代碼--><body-content>scriptless</body-content> </tag>開發(fā)好一個(gè)標(biāo)簽后,在tld文件中使用<tag>來描述一個(gè)標(biāo)簽,描述的內(nèi)容包括標(biāo)簽名(name),標(biāo)簽處理器類(tag-class),標(biāo)簽體的內(nèi)容(body-content)。
tld文件中有四種標(biāo)簽體(body-content)類型 :empty、scriptless、JSP、tagdependent?
empty:表示該標(biāo)簽沒有標(biāo)簽體
scriptless:表示該標(biāo)簽是有標(biāo)簽體的,但是標(biāo)簽體的內(nèi)容不能是java代碼
JSP:表示該標(biāo)簽是有標(biāo)簽體的,并且標(biāo)簽體的內(nèi)容可以是任意的,包括java代碼
tagdependent:表示標(biāo)簽體里面的內(nèi)容是給標(biāo)簽處理器類使用的(tagdependent用得比較少,了解一下即可)
簡單標(biāo)簽標(biāo)簽體的細(xì)節(jié)注意問題:
?在簡單標(biāo)簽(SampleTag)中標(biāo)簽體body-content的值只允許是empty、scriptless、tagdependent,不允許設(shè)置成JSP,如果設(shè)置成JSP就會(huì)出現(xiàn)異常:
tld文件中用于描述標(biāo)簽屬性的<attribute>元素說明
<tag>元素的<attribute>子元素用于描述自定義標(biāo)簽的一個(gè)屬性,自定義標(biāo)簽所具有的每個(gè)屬性都要對(duì)應(yīng)一個(gè)<attribute>元素
java類:?
package me.gacl.web.tag;import java.io.IOException;import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.JspFragment; import javax.servlet.jsp.tagext.SimpleTagSupport;public class SimpleTagDemo2 extends SimpleTagSupport{private int count;public void setCount(int count){this.count = count;}@Overridepublic void doTag() throws JspException, IOException {JspFragment jspFragment = this.getJspBody();for (int i = 1; i <= count; i++){jspFragment.invoke(null);}} }tld代碼
<tag><!-- 標(biāo)簽名 --><name>demo5</name><!-- 標(biāo)簽處理器類--><tag-class>me.gacl.web.simpletag.SimpleTagDemo5</tag-class><!-- 標(biāo)簽體允許的內(nèi)容--><body-content>scriptless</body-content><!-- 標(biāo)簽的屬性描述 --><attribute><description>描述標(biāo)簽的count屬性</description><!-- 標(biāo)簽的count屬性 --><name>count</name><required>true</required><!-- rtexprvalue用來指示標(biāo)簽的屬性值是否可以是一個(gè)表達(dá)式,一般設(shè)置為true,true就表示允許標(biāo)簽的屬性值可以是一個(gè)表達(dá)式--><rtexprvalue>true</rtexprvalue></attribute> </tag>?
<attribute>元素的子元素說明:
?
轉(zhuǎn)載于:https://www.cnblogs.com/dulianyong/p/10271552.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的javaweb学习6——自定义标签的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 类型转换String,List
- 下一篇: 宁波银行白领通是什么?申请条件有哪些?