聲明:本文只是自學過程中,記錄自己不會的知識點的摘要,如果想詳細學習JavaWeb,請到孤傲蒼狼博客學習,JavaWeb學習點此跳轉
本文鏈接: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
傳統標簽接口中的各個方法可以返回的返回值說明:
下圖列舉了Tag接口、IterationTag接口和BodyTag接口中的主要方法及它們分別可以返回的返回值的說明。
在JSP?API中也提供了IterationTag接口的默認實現類TagSupport、IterationTag接口的默認實現類TagSupport和BodyTag接口的實現類BodyTagSupport,我們在編寫自定義標簽的標簽處理器類時,可以繼承和擴展TagSupport類、IterationSupport類和BodyTagSupport類。
開發簡單標簽實現頁面邏輯
1.控制jsp頁面某一部分內容是否執行
編寫一個類繼承SimpleTagSupport,然后再重寫doTag方法,在doTag方法里面是否調用jspFrament.invoke方法來控制標簽是否執行。
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類實現了SimpleTag接口,* SampleTagDemo1類繼承SimpleTagSupport*/ public class SimpleTagDemo1 extends SimpleTagSupport {/* 簡單標簽使用這個方法就可以完成所有的業務邏輯* @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag()* 重寫doTag方法,控制標簽體是否執行*/@Overridepublic void doTag() throws JspException, IOException {//得到代表jsp標簽體的JspFragmentJspFragment jspFragment = this.getJspBody();//得到jsp頁面的的PageContext對象//PageContext pageContext = (PageContext) jspFragment.getJspContext();//調用JspWriter將標簽體的內容輸出到瀏覽器//jspFragment.invoke(pageContext.getOut());//將標簽體的內容輸出到瀏覽器jspFragment.invoke(null);} }
2.控制jsp頁面內容重復執行
編寫一個類繼承SimpleTagSupport,然后再重寫doTag方法,在doTag方法里面重復調用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類實現了SimpleTag接口,* SampleTagDemo2類繼承SimpleTagSupport*/ public class SimpleTagDemo2 extends SimpleTagSupport {/* 簡單標簽使用這個方法就可以完成所有的業務邏輯* @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag()* 重寫doTag方法,控制標簽執行5次*/@Overridepublic void doTag() throws JspException, IOException {// 得到代表jsp標簽體的JspFragmentJspFragment jspFragment = this.getJspBody();for (int i = 0; i < 5; i++) {// 將標簽體的內容輸出到瀏覽器jspFragment.invoke(null);}} }
3.修改jsp頁面內容輸出
編寫一個類繼承SimpleTagSupport,然后再重寫doTag方法,在doTag方法調用jspFrament.invoke方法時,讓執行結果寫一個自定義的緩沖中即可,然后開發人員可以取出緩沖的數據修改輸出。
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類實現了SimpleTag接口,* SampleTagDemo3類繼承SimpleTagSupport*/ public class SimpleTagDemo3 extends SimpleTagSupport {/* 簡單標簽使用這個方法就可以完成所有的業務邏輯* @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag()* 重寫doTag方法,修改標簽體里面的內容,將標簽體的內容轉換成大寫*/@Overridepublic void doTag() throws JspException, IOException {// 得到代表jsp標簽體的JspFragmentJspFragment jspFragment = this.getJspBody();StringWriter sw = new StringWriter();//將標簽體的內容寫入到sw流中 jspFragment.invoke(sw);//獲取sw流緩沖區的內容String content = sw.getBuffer().toString();content = content.toUpperCase();PageContext pageContext = (PageContext) this.getJspContext();//將修改后的content輸出到瀏覽器中 pageContext.getOut().write(content);} }
4.控制整個jsp頁面是否執行
編寫一個類繼承SimpleTagSupport,然后再重寫doTag方法,在doTag方法拋出SkipPageException異常即可,jsp收到這個異常,將忽略標簽余下jsp頁面的執行。
示例代碼如下:
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類實現了SimpleTag接口,* SampleTagDemo4類繼承SimpleTagSupport*/ public class SimpleTagDemo4 extends SimpleTagSupport {/* 簡單標簽使用這個方法就可以完成所有的業務邏輯* @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag()* 重寫doTag方法,控制標簽余下的Jsp不執行*/@Overridepublic void doTag() throws JspException, IOException {//拋出一個SkipPageException異常就可以控制標簽余下的Jsp不執行throw new SkipPageException();} }
tld文件中標簽體類型設置細節
<tag><!-- 標簽名 --><name>demo2</name><!-- 標簽處理器類--><tag-class>me.gacl.web.simpletag.SimpleTagDemo2</tag-class><!-- 標簽體允許的內容 ,scriptless表示標簽體的內容不允許是java腳本代碼--><body-content>scriptless</body-content> </tag>
開發好一個標簽后,在tld文件中使用<tag>來描述一個標簽,描述的內容包括標簽名(name),標簽處理器類(tag-class),標簽體的內容(body-content)。
tld文件中有四種標簽體(body-content)類型 :empty、scriptless、JSP、tagdependent?
empty:表示該標簽沒有標簽體
scriptless:表示該標簽是有標簽體的,但是標簽體的內容不能是java代碼
JSP:表示該標簽是有標簽體的,并且標簽體的內容可以是任意的,包括java代碼
tagdependent:表示標簽體里面的內容是給標簽處理器類使用的(tagdependent用得比較少,了解一下即可)
簡單標簽標簽體的細節注意問題:
?在簡單標簽(SampleTag)中標簽體body-content的值只允許是empty、scriptless、tagdependent,不允許設置成JSP,如果設置成JSP就會出現異常:
The TLD for the class me.gacl.web.simpletag.SimpleTagDemo1 specifies an invalid body-content (JSP) for a SimpleTag
tld文件中用于描述標簽屬性的<attribute>元素說明
<tag>元素的<attribute>子元素用于描述自定義標簽的一個屬性,自定義標簽所具有的每個屬性都要對應一個<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><!-- 標簽名 --><name>demo5</name><!-- 標簽處理器類--><tag-class>me.gacl.web.simpletag.SimpleTagDemo5</tag-class><!-- 標簽體允許的內容--><body-content>scriptless</body-content><!-- 標簽的屬性描述 --><attribute><description>描述標簽的count屬性</description><!-- 標簽的count屬性 --><name>count</name><required>true</required><!-- rtexprvalue用來指示標簽的屬性值是否可以是一個表達式,一般設置為true,true就表示允許標簽的屬性值可以是一個表達式--><rtexprvalue>true</rtexprvalue></attribute> </tag>
?
<attribute>元素的子元素說明:
?