日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

javaweb学习总结(二十五)——jsp简单标签开发(一)

發布時間:2024/9/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 javaweb学习总结(二十五)——jsp简单标签开发(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、簡單標簽(SimpleTag)

  由于傳統標簽使用三個標簽接口來完成不同的功能,顯得過于繁瑣,不利于標簽技術的推廣, SUN公司為降低標簽技術的學習難度,在JSP 2.0中定義了一個更為簡單、便于編寫和調用的SimpleTag接口來實現標簽的功能。

  

實現SimpleTag接口的標簽通常稱為簡單標簽。簡單標簽共定義了5個方法:

  • setJspContext方法
  • setParent和getParent方法
  • setJspBody方法
  • doTag方法(非常重要),簡單標簽使用這個方法就可以完成所有的業務邏輯

二、SimpleTag方法介紹

2.1、setJspContext方法

  用于把JSP頁面的pageContext對象傳遞給標簽處理器對象

2.2、setParent方法

  用于把父標簽處理器對象傳遞給當前標簽處理器對象

2.3、getParent方法

用于獲得當前標簽的父標簽處理器對象

2.4、setJspBody方法

  用于把代表標簽體的JspFragment對象傳遞給標簽處理器對象

2.5、doTag方法

  用于完成所有的標簽邏輯,包括輸出、迭代、修改標簽體內容等。在doTag方法中可以拋出javax.servlet.jsp.SkipPageException異常,用于通知WEB容器不再執行JSP頁面中位于結束標記后面的內容,這等效于在傳統標簽的doEndTag方法中返回Tag.SKIP_PAGE常量的情況。

三、SimpleTag接口方法的執行順序

  當web容器開始執行標簽時,會調用如下方法完成標簽的初始化:

  • WEB容器調用標簽處理器對象的setJspContext方法,將代表JSP頁面的pageContext對象傳遞給標簽處理器對象。
  • WEB容器調用標簽處理器對象的setParent方法,將父標簽處理器對象傳遞給這個標簽處理器對象。注意,只有在標簽存在父標簽的情況下,WEB容器才會調用這個方法。
  • 如果調用標簽時設置了屬性,容器將調用每個屬性對應的setter方法把屬性值傳遞給標簽處理器對象。如果標簽的屬性值是EL表達式或腳本表達式,則WEB容器首先計算表達式的值,然后把值傳遞給標簽處理器對象。
  • 如果簡單標簽有標簽體,WEB容器將調用setJspBody方法把代表標簽體的JspFragment對象傳遞進來。
  • 執行標簽時WEB容器調用標簽處理器的doTag()方法,開發人員在方法體內通過操作JspFragment對象,就可以實現是否執行、迭代、修改標簽體的目的。
  • 四、開發簡單標簽實現頁面邏輯

      SUN公司針對SimpleTag接口提供了一個默認的實現類SimpleTagSupport,SimpleTagSupport類中實現了SimpleTag接口的所有方法,因此我們可以編寫一個類繼承SimpleTagSupport類,然后根據業務需要再重寫doTag方法。

    4.1、控制jsp頁面某一部分內容是否執行

     編寫一個類繼承SimpleTagSupport,然后再重寫doTag方法,在doTag方法里面不調用jspFrament.invoke方法即可。

    示例代碼如下:

    SimpleTagDemo1.java

    1 package me.gacl.web.simpletag;2 3 import java.io.IOException;4 5 import javax.servlet.jsp.JspException;6 import javax.servlet.jsp.PageContext;7 import javax.servlet.jsp.tagext.JspFragment;8 import javax.servlet.jsp.tagext.SimpleTagSupport;9 10 /** 11 * @author gacl 12 * SimpleTagSupport類實現了SimpleTag接口, 13 * SampleTagDemo1類繼承SimpleTagSupport 14 */ 15 public class SimpleTagDemo1 extends SimpleTagSupport { 16 17 /* 簡單標簽使用這個方法就可以完成所有的業務邏輯 18 * @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag() 19 * 重寫doTag方法,控制標簽體是否執行 20 */ 21 @Override 22 public void doTag() throws JspException, IOException { 23 //得到代表jsp標簽體的JspFragment 24 JspFragment jspFragment = this.getJspBody(); 25 26 //得到jsp頁面的的PageContext對象 27 //PageContext pageContext = (PageContext) jspFragment.getJspContext(); 28 //調用JspWriter將標簽體的內容輸出到瀏覽器 29 //jspFragment.invoke(pageContext.getOut()); 30 31 //將標簽體的內容輸出到瀏覽器 32 jspFragment.invoke(null); 33 34 } 35 }

      在WEB-INF目錄下新建一個simpletag.tld文件,然后在simpletag.tld文件中添加對該標簽處理類的描述,如下:

      

      simpletag.tld文件代碼如下:

    1 <?xml version="1.0" encoding="UTF-8" ?>2 3 <taglib xmlns="http://java.sun.com/xml/ns/j2ee"4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"5 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"6 version="2.0">7 <!-- description用來添加對taglib(標簽庫)的描述 -->8 <description>孤傲蒼狼開發的SimpleTag自定義標簽庫</description>9 <!--taglib(標簽庫)的版本號 --> 10 <tlib-version>1.0</tlib-version> 11 <short-name>GaclSimpleTagLibrary</short-name> 12 <!-- 13 為自定義標簽庫設置一個uri,uri以/開頭,/后面的內容隨便寫,如這里的/simpletag , 14 在Jsp頁面中引用標簽庫時,需要通過uri找到標簽庫 15 在Jsp頁面中就要這樣引入標簽庫:<%@taglib uri="/simpletag" prefix="gacl"%> 16 --> 17 <uri>/simpletag</uri> 18 19 <!--一個taglib(標簽庫)中包含多個自定義標簽,每一個自定義標簽使用一個tag標記來描述 --> 20 <!-- 一個tag標記對應一個自定義標簽 --> 21 <tag> 22 <description>SimpleTag(簡單標簽)Demo1</description> 23 <!-- 24 為標簽處理器類配一個標簽名,在Jsp頁面中使用標簽時是通過標簽名來找到要調用的標簽處理器類的 25 通過demo1就能找到對應的me.gacl.web.simpletag.SimpleTagDemo1類 26 --> 27 <name>demo1</name> 28 <!-- 標簽對應的處理器類--> 29 <tag-class>me.gacl.web.simpletag.SimpleTagDemo1</tag-class> 30 <!-- 31 tld文件中有四種標簽體類型 :empty JSP scriptless tagdepentend 32 在簡單標簽(SampleTag)中標簽體body-content的值只允許是empty和scriptless,不允許設置成JSP,如果設置成JSP就會出現異常 33 在傳統標簽中標簽體body-content的值只允許是empty和JSP 34 如果標簽體body-content的值設置成tagdepentend,那么就表示標簽體里面的內容是給標簽處理器類使用的, 35 例如:開發一個查詢用戶的sql標簽,此時標簽體重的SQL語句就是給SQL標簽的標簽處理器來使用的 36 <gacl:sql>SELECT * FROM USER</gacl:sql> 37 在這種情況下,sql標簽的<body-content>就要設置成tagdepentend,tagdepentend用得比較少,了解一下即可 38 --> 39 <body-content>scriptless</body-content> 40 </tag> 41 </taglib>

      在jsp頁面中導入并使用自定義標簽,如下:

    1 <%@ page language="java" pageEncoding="UTF-8"%>2 <%--在jsp頁面中導入自定義標簽庫 --%>3 <%@taglib uri="/simpletag" prefix="gacl" %>4 <!DOCTYPE HTML>5 <html>6 <head>7 <title>用簡單標簽控制標簽體是否執行</title>8 </head>9 10 <body> 11 12 <%--在jsp頁面中使用自定義標簽 demo1標簽是帶有標簽體的,標簽體的內容是"孤傲蒼狼"這幾個字符串--%> 13 <gacl:demo1> 14 孤傲蒼狼 15 </gacl:demo1> 16 </body> 17 </html>

      運行效果如下:

      

    4.2、控制jsp頁面內容重復執行

      編寫一個類繼承SimpleTagSupport,然后再重寫doTag方法,在doTag方法里面重復調用jspFrament.invoke方法即可。

    示例代碼如下:

    SimpleTagDemo2.java

    1 package me.gacl.web.simpletag;2 3 import java.io.IOException;4 5 import javax.servlet.jsp.JspException;6 import javax.servlet.jsp.tagext.JspFragment;7 import javax.servlet.jsp.tagext.SimpleTagSupport;8 9 /** 10 * @author gacl 11 * SimpleTagSupport類實現了SimpleTag接口, 12 * SampleTagDemo2類繼承SimpleTagSupport 13 */ 14 public class SimpleTagDemo2 extends SimpleTagSupport { 15 16 /* 簡單標簽使用這個方法就可以完成所有的業務邏輯 17 * @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag() 18 * 重寫doTag方法,控制標簽執行5次 19 */ 20 @Override 21 public void doTag() throws JspException, IOException { 22 // 得到代表jsp標簽體的JspFragment 23 JspFragment jspFragment = this.getJspBody(); 24 for (int i = 0; i < 5; i++) { 25 // 將標簽體的內容輸出到瀏覽器 26 jspFragment.invoke(null); 27 } 28 } 29 }

      在WEB-INF目錄下的simpletag.tld文件中添加對該標簽處理類的描述,如下:

    1 <tag> 2 <!-- 標簽名 --> 3 <name>demo2</name> 4 <!-- 標簽處理器類--> 5 <tag-class>me.gacl.web.simpletag.SimpleTagDemo2</tag-class> 6 <!-- 標簽體允許的內容 ,scriptless表示標簽體的內容不允許是java腳本代碼--> 7 <body-content>scriptless</body-content> 8 </tag>

      在jsp頁面中導入并使用自定義標簽,如下:

    1 <%@ page language="java" pageEncoding="UTF-8"%>2 <%--在jsp頁面中導入自定義標簽庫 --%>3 <%@taglib uri="/simpletag" prefix="gacl" %>4 <!DOCTYPE HTML>5 <html>6 <head>7 <title>用簡單標簽控制標簽體執行5次</title>8 </head>9 10 <body> 11 12 <%--在jsp頁面中使用自定義標簽 --%> 13 <gacl:demo2> 14 孤傲蒼狼<p/> 15 </gacl:demo2> 16 </body> 17 </html>

      運行效果如下:

      

    4.3、修改jsp頁面內容輸出

      編寫一個類繼承SimpleTagSupport,然后再重寫doTag方法,在doTag方法調用jspFrament.invoke方法時,讓執行結果寫一個自定義的緩沖中即可,然后開發人員可以取出緩沖的數據修改輸出。

    示例代碼如下:

    SimpleTagDemo3.java

    1 package me.gacl.web.simpletag;2 3 import java.io.IOException;4 import java.io.StringWriter;5 6 import javax.servlet.jsp.JspException;7 import javax.servlet.jsp.PageContext;8 import javax.servlet.jsp.tagext.JspFragment;9 import javax.servlet.jsp.tagext.SimpleTagSupport; 10 11 /** 12 * @author gacl 13 * SimpleTagSupport類實現了SimpleTag接口, 14 * SampleTagDemo3類繼承SimpleTagSupport 15 */ 16 public class SimpleTagDemo3 extends SimpleTagSupport { 17 18 /* 簡單標簽使用這個方法就可以完成所有的業務邏輯 19 * @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag() 20 * 重寫doTag方法,修改標簽體里面的內容,將標簽體的內容轉換成大寫 21 */ 22 @Override 23 public void doTag() throws JspException, IOException { 24 // 得到代表jsp標簽體的JspFragment 25 JspFragment jspFragment = this.getJspBody(); 26 StringWriter sw = new StringWriter(); 27 //將標簽體的內容寫入到sw流中 28 jspFragment.invoke(sw); 29 //獲取sw流緩沖區的內容 30 String content = sw.getBuffer().toString(); 31 content = content.toUpperCase(); 32 PageContext pageContext = (PageContext) this.getJspContext(); 33 //將修改后的content輸出到瀏覽器中 34 pageContext.getOut().write(content); 35 } 36 }

      在WEB-INF目錄下的simpletag.tld文件中添加對該標簽處理類的描述,如下:

    1 <tag> 2 <!-- 標簽名 --> 3 <name>demo3</name> 4 <!-- 標簽處理器類--> 5 <tag-class>me.gacl.web.simpletag.SimpleTagDemo3</tag-class> 6 <!-- 標簽體允許的內容 ,scriptless表示標簽體的內容不允許是java腳本代碼--> 7 <body-content>scriptless</body-content> 8 </tag>

      在jsp頁面中導入并使用自定義標簽,如下:

    1 <%@ page language="java" pageEncoding="UTF-8"%>2 <%--在jsp頁面中導入自定義標簽庫 --%>3 <%--<%@taglib uri="/simpletag" prefix="gacl" %>--%>4 <%--在jsp頁面中也可以使用這種方式導入標簽庫,直接把uri設置成標簽庫的tld文件所在目錄 --%>5 <%@taglib uri="/WEB-INF/simpletag.tld" prefix="gacl"%>6 <!DOCTYPE HTML>7 <html>8 <head>9 <title>用簡單標簽修改jsp頁面內容輸出</title> 10 </head> 11 12 <body> 13 14 <%--在jsp頁面中使用自定義標簽 --%> 15 <gacl:demo3> 16 gacl_xdp 17 </gacl:demo3> 18 </body> 19 </html>

      運行效果如下:

      

    4.4、控制整個jsp頁面是否執行

      編寫一個類繼承SimpleTagSupport,然后再重寫doTag方法,在doTag方法拋出SkipPageException異常即可,jsp收到這個異常,將忽略標簽余下jsp頁面的執行。

    示例代碼如下:

    SimpleTagDemo4.java

    1 package me.gacl.web.simpletag;2 3 import java.io.IOException;4 import javax.servlet.jsp.JspException;5 import javax.servlet.jsp.SkipPageException;6 import javax.servlet.jsp.tagext.SimpleTagSupport;7 8 /**9 * @author gacl 10 * SimpleTagSupport類實現了SimpleTag接口, 11 * SampleTagDemo4類繼承SimpleTagSupport 12 */ 13 public class SimpleTagDemo4 extends SimpleTagSupport { 14 15 /* 簡單標簽使用這個方法就可以完成所有的業務邏輯 16 * @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag() 17 * 重寫doTag方法,控制標簽余下的Jsp不執行 18 */ 19 @Override 20 public void doTag() throws JspException, IOException { 21 //拋出一個SkipPageException異常就可以控制標簽余下的Jsp不執行 22 throw new SkipPageException(); 23 } 24 }

      在WEB-INF目錄下的simpletag.tld文件中添加對該標簽處理類的描述,如下:

    1 <tag> 2 <!-- 標簽名 --> 3 <name>demo4</name> 4 <!-- 標簽處理器類--> 5 <tag-class>me.gacl.web.simpletag.SimpleTagDemo4</tag-class> 6 <!-- 標簽體允許的內容 ,empty表示該標簽沒有標簽體--> 7 <body-content>empty</body-content> 8 </tag>

      在jsp頁面中導入并使用自定義標簽,如下:

    1 <%@ page language="java" pageEncoding="UTF-8"%>2 <%--在jsp頁面中導入自定義標簽庫 --%>3 <%--<%@taglib uri="/simpletag" prefix="gacl" %>--%>4 <%--在jsp頁面中也可以使用這種方式導入標簽庫,直接把uri設置成標簽庫的tld文件所在目錄 --%>5 <%@taglib uri="/WEB-INF/simpletag.tld" prefix="gacl"%>6 <!DOCTYPE HTML>7 <html>8 <head>9 <title>用簡單標簽控制標簽余下的Jsp不執行</title> 10 </head> 11 12 <body> 13 <h1>孤傲蒼狼</h1> 14 <%--在jsp頁面中使用自定義標簽 --%> 15 <gacl:demo4/> 16 <!-- 這里的內容位于 <gacl:demo4/>標簽后面,因此不會輸出到頁面上 --> 17 <h1>白虎神皇</h1> 18 </body> 19 </html>

      運行效果如下:

      

    五、簡單標簽開發的一些注意細節

    5.1、標簽類編寫細節

      開發標簽類時,不要直接去實現SimpleTag接口,而是應該繼承SimpleTagSupport類,SimpleTagSupport類是SimpleTag接口的一個默認實現類,通過繼承SimpleTagSupport類,就可以直接使用SimpleTagSupport類已經實現的那些方法,如果SimpleTagSupport類的方法實現不滿足業務要求,那么就可以根據具體的業務情況將相應的方法進行重寫。

    5.2、tld文件中標簽體類型設置細節

      我們開發好一個簡單標簽后,需要在tld文件中添加對該標簽的描述,例如:

    1 <tag> 2 <!-- 標簽名 --> 3 <name>demo2</name> 4 <!-- 標簽處理器類--> 5 <tag-class>me.gacl.web.simpletag.SimpleTagDemo2</tag-class> 6 <!-- 標簽體允許的內容 ,scriptless表示標簽體的內容不允許是java腳本代碼--> 7 <body-content>scriptless</body-content> 8 </tag>

      開發好一個標簽后,在tld文件中使用<tag>來描述一個標簽,描述的內容包括標簽名(name),標簽處理器類(tag-class),標簽體的內容(body-content)。

      tld文件中有四種標簽體(body-content)類型 :empty、JSP、scriptless、tagdependent?

    簡單標簽標簽體的細節注意問題:在簡單標簽(SampleTag)中標簽體body-content的值只允許是empty、scriptless、tagdependent,不允許設置成JSP,如果設置成JSP就會出現異常

    1 The TLD for the class me.gacl.web.simpletag.SimpleTagDemo1 specifies an invalid body-content (JSP) for a SimpleTag

      body-content的值如果設置成empty,那么就表示該標簽沒有標簽體,如果是設置成scriptless,那么表示該標簽是有標簽體的,但是標簽體中的內容不可以是<%java代碼%>,例如:

    1 <gacl:xdpdemo1> 2 <% 3 //嵌套在標簽體中的java代碼 4 int i= 0; 5 %> 6 孤傲蒼狼 7 </gacl:xdpdemo1>

      否則運行標簽時就會出現如下錯誤:

    1 Scripting elements ( &lt;%!, &lt;jsp:declaration, &lt;%=, &lt;jsp:expression, &lt;%, &lt;jsp:scriptlet ) are disallowed here

      jsp標簽技術出現的目的就是為了移除在jsp頁面上編寫的java代碼的,如果在jsp標簽中允許出現java代碼,那么就違背了jsp標簽技術設計時的初衷了。所以在簡單標簽的標簽體中是不允許出現java代碼的。

    傳統標簽標簽體的細節注意問題:在傳統標簽中標簽體body-content的值允許是empty、JSP、scriptless、tagdependentbody-content的值如果是設置成JSP那么表示該標簽是有標簽體的,并且標簽體的內容可以是任意的,包括java代碼,如果是設置成scriptless那么表示該標簽是有標簽體的,但是標簽體的內容不能是java代碼

      如果傳統標簽簡單標簽的標簽體body-content的值設置成tagdependent,那么就表示標簽體里面的內容是給標簽處理器類使用的,tagdependent用得比較少,了解一下即可

    5.3、tld文件中標簽庫的uri設置細節

      如果在一個項目中使用或者開發了多個標簽庫,例如:

      

      那么標簽庫的uri不能設置成相同的,否則在Jsp頁面中通過uri引用標簽庫時就不知道引用哪一個標簽庫了,如果真的有那么巧,兩個標簽庫的uri是剛好一樣的,如下圖所示:

      

      那么在jsp頁面中引用標簽庫時如果"<%@taglib uri="/gacl" prefix="gacl" %>"這樣引用,那么就無法判斷當前引用的標簽庫到底是gacl.tld標簽庫中的標簽還是simpletag.tld標簽庫中的標簽,因為兩個標簽庫的uri剛好都是"/gacl",在兩個標簽庫的引用uri一樣的情況下,為了能夠在jsp中區別到底引用的是哪個標簽庫,可以換一種引用方式:<%@taglib uri="要引用的標簽庫的tld文件目錄" prefix="gacl"%>,使用taglib指令引入標簽庫時,taglib指令的uri屬性指定為標簽庫的tld文件目錄,這樣就可以區別開了,例如:

      引用gacl.tld標簽庫:<%@taglib uri="/WEB-INF/gacl.tld" prefix="gacl"%>、

      引用simpletag.tld標簽庫:<%@taglib uri="/WEB-INF/simpletag.tld" prefix="gacl"%>

      所以當在項目中引用了多個標簽庫,如果標簽庫的uri剛好是一樣的,就可以用這種方式解決。

    六、簡單標簽開發步驟總結

      1、編寫一個類繼承SimpleTagSupport類,然后根據業務需要重寫SimpleTagSupport類中已經實現了的方法,一般情況下只需要重寫doTag()方法即可。

      2、在WEB-INF目錄下創建一個tld文件,在tld文件中添加對該標簽的描述。tld文件不一定放在WEB-INF目錄下,也可以放在別的目錄,習慣是放在WEB-INF目錄下。

    與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的javaweb学习总结(二十五)——jsp简单标签开发(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。