javaweb學習6——自定義標簽

聲明:本文只是自學過程中,記錄自己不會的知識點的摘要,如果想詳細學習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接口的默認實現類TagSupportBodyTag接口的實現類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>元素的子元素說明:

  

?

轉載于:https://www.cnblogs.com/dulianyong/p/10271552.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/249825.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/249825.shtml
英文地址,請注明出處:http://en.pswp.cn/news/249825.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

goland 實用鍵

代碼補全 option command v轉載于:https://www.cnblogs.com/smzd/p/10313417.html

關于Mysql java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)的問題...

問題所在&#xff1a; 1.連接數據庫一個是密碼是否正確&#xff0c; 2.driver是否對&#xff0c; 3.有么有jar包沖突&#xff0c;轉載于:https://www.cnblogs.com/java-123/p/9403412.html

vscode配置vue環境

一、安裝VSCode、NodeJS VSCode&#xff1a;https://code.visualstudio.com/ NodeJS&#xff1a;https://nodejs.org/en/ 二、打開VSCode&#xff0c;安裝常用插件 如圖所示&#xff08;安裝后重新加載即可&#xff09;: 三、項目中添加.vscode文件夾&#xff0c;文件夾中添…

秒殺核心設計(減庫存部分)-防超賣與高并發

商品詳情頁面的靜態化&#xff0c;varnish加速&#xff0c;秒殺商品庫獨立部署服務器這種就略過不講了。只討論庫存部分的優化 mysql配置層面的優化可以參考我的這篇文章 《關于mysql innodb引擎性能優化的一點心得》 重點設計在數據庫層面。 2張表&#xff1a; 第一張&#xf…

go strconv

strconv是golang用來做數據類型轉換的一個庫。 介紹下strconv最常用的兩個方法, 沒有解釋語言那么自在可以str(int),int(string), 那還算簡練。 num, err : strconv.Atoi("-42") str : strconv.Itoa(-42)轉換換成bool類型. b, err : strconv.ParseBool("true&qu…

django配置templates、static、media和連接mysql數據庫

1.模板文件 # templates配置 if os.path.exists(os.path.join(BASE_DIR, templates)) is False:os.mkdir(os.path.join(BASE_DIR, templates)) TEMPLATES [{# 模板引擎&#xff0c;內置的模板引擎有&#xff1a;# 1. django.template.backends.django.DjangoTemplates# 2. dj…

vue調用順序(初學版) index.html → main.js → app.vue → index.js → components/組件 測試

關于它是怎么調用運作的&#xff1a;https://mp.csdn.net/postedit/86134414 一. 準備工作&#xff1a; 1.下載webstorm&#xff0c;安裝vue。 2.創建項目&#xff0c;cd到要放項目的文件夾下 vue init webpack vue_test 3.安裝各種包 npm install 4.運行 cd vue_test …

web開發:jquery之DOM

一、文檔結構 二、文檔操作 三、文檔操作案例 四、form表單 五、正則 六、form案例 一、文檔結構 jsvar $sup $(.sup);console.log($sup.children()); // 子們console.log($sup.parent()); // 父console.log($sup.prev()); // 上兄弟console.log($sup.next()); // 下兄弟c…

NO.8:自學python之路------并行socket網絡編程

摘要 一到放假就雜事很多&#xff0c;這次的作業比較復雜&#xff0c;做了一個周&#xff0c;進度又拖了。不過結果還不錯。 正文 粘包 在上一節中&#xff0c;如果連續發送過多數據&#xff0c;就可能發生粘包。粘包就是兩次發送的數據粘在一起被接收&#xff0c;損壞了數據的…

vue項目中主要文件的加載順序(index.html、App.vue、main.js)

先后順序&#xff1a; index.html > App.vue的export外的js代碼 > main.js > App.vue的export里面的js代碼 > Index.vue的export外的js代碼 測試的頁面代碼塊&#xff1a; 文件的加載先后順序&#xff1a; Index.vue的mounted()中的輸出沒有執行。why&#…

Http請求報頭設置(C#)

1、添加一個SetHeaderValue方法&#xff1a; public static void SetHeaderValue(WebHeaderCollection header, string name, string value) { var property typeof(WebHeaderCollection).GetProperty("InnerCollection",BindingFlags.Instance | BindingFlags.NonP…

vue-cli3使用cdn引入

1. index.html引入&#xff1a; <script src"https://cdn.bootcss.com/moment.js/2.20.1/moment.min.js"></script> <script src"https://cdn.bootcss.com/moment.js/2.20.1/locale/zh-cn.js"></script>2. vue.config.js配置&…

vue常用屬性

Vue實例常用屬性 1.數據 data:Vue 實例的數據對象 components&#xff1a;Vue實例配置局部注冊組件 1.類方法 computed:計算屬性 watch&#xff1a;偵聽屬性 filters&#xff1a;過濾器 methods:Vue實例方法 render&#xff1a;渲染函數&#xff0c;創建虛擬DOM 1.生命周期 c…

凸包算法

轉載自&#xff1a;https://blog.csdn.net/bone_ace/article/details/46239187 凸包問題的五種解法 2015年05月29日 17:58:51 閱讀數&#xff1a;33660前言&#xff1a; 首先&#xff0c;什么是凸包&#xff1f; 假設平面上有p0~p12共13個點&#xff0c;過某些點作一個多邊形&a…

一個優雅的占位圖解決方案。適用于 UITableView 和 UICollectionView。

FMListPlaceholder 項目地址&#xff1a;https://github.com/yfming93/FMListPlaceholder 一個優雅的占位圖解決方案。適用于 UITableView 和 UICollectionView。 一行代碼處理空列表占位圖邏輯 0x001 與其他的同類三方庫對比的優點&#xff1a; 首次進入列表占位圖是不顯示的。…

es7 async 前置依賴

https://stackoverflow.com/questions/33527653/babel-6-regeneratorruntime-is-not-defined 移動端 px2rem-loader 轉載于:https://www.cnblogs.com/smzd/p/10560176.html

vue中 關于$emit的用法

1、父組件可以使用 props 把數據傳給子組件。 2、子組件可以使用 $emit 觸發父組件的自定義事件。 vm.$emit( event, arg ) //觸發當前實例上的事件 vm.$on( event, fn );//監聽event事件后運行 fn&#xff1b; 例如&#xff1a;子組件&#xff1a; <template><di…

SSO閱讀有感

SSO比較詳細且理解。贊 鏈接&#xff1a;https://www.cnblogs.com/ywlaker/p/6113927.html轉載于:https://www.cnblogs.com/z1j2r3/p/9408480.html

C語言——反彈球游戲(第二階段

#include<stdio.h> #include<stdlib.h> #include<windows.h> #include<conio.h>#define High 15 //游戲畫面尺寸 #define Width 20//全局變量 int ball_x,ball_y; //小球的坐標 int ball_vx,ball_vy; //小球的速度 int canvas[High][W…

docker運行我們的容器

docker images docker pull nginx 運行 docker images 查看Nginx鏡像是否獲取成功&#xff0c;若為如下所示即為獲取成功&#xff1a; docker run -p 8080:80 -d nginx docker run –name 容器名 -d&#xff08;后臺運行&#xff09;-p 本地端口:容器端口 -v(掛載) 掛載本地路徑…