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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java自定义jsp标签_Javaweb自定义jsp标签

發布時間:2025/3/21 java 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java自定义jsp标签_Javaweb自定义jsp标签 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

自定義標簽

用戶定義的一種自定義的jsp標記,當一個含有自定義標簽的jsp頁面被jsp引擎編譯成Servlet時,tag標簽被轉化成了對一個稱為標簽處理類的對象的操作。于是當jsp頁面被jsp引擎轉化為Servlet后,實際上tag標簽被轉化為對tag處理類的操作

自定義標簽的開發與應用步驟

1、編寫標簽處理器:能夠完成標簽功能的java類,繼承SimpleTagSupport類

2、編寫標簽庫描述(tld)文件,在tld文件中對自定義標簽進行描述:建議該文件放在WEB-INF下

3、在jsp頁面中導入和使用自定義標簽

標簽處理類的生命周期

示例:自定義簡單標簽hello

沒有標簽體和屬性

標簽處理類:?HelloTag.java,實現SimpleTag接口

1 importjava.io.IOException;2 importjavax.servlet.jsp.JspContext;3 importjavax.servlet.jsp.JspException;4 importjavax.servlet.jsp.PageContext;5 importjavax.servlet.jsp.tagext.JspFragment;6 importjavax.servlet.jsp.tagext.JspTag;7 importjavax.servlet.jsp.tagext.SimpleTag;8 public class HelloTag implementsSimpleTag {9 @Override10 public void doTag() throwsJspException, IOException {11 System.out.println("doTag");12 this.pageContext.getOut().print("HelloWorld");13 }14 @Override15 public voidsetParent(JspTag parent) {16 System.out.println("setParent");17 }18 @Override19 publicJspTag getParent() {20 System.out.println("getParent");21 return null;22 }23

24 privatePageContext pageContext ;25 @Override26 public voidsetJspContext(JspContext pc) {27 System.out.println("setJspContext");28 this.pageContext =(PageContext) pc ;29 }30

31 @Override32 public voidsetJspBody(JspFragment jspBody) {33 System.out.println("setJspBody");34 }35

36 }

View Code

標簽庫描述文件:mytag.tld

1 <?xml version="1.0" encoding="UTF-8"?>

2

3 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"

4 version="2.0">

5

6 MyTag 1.0 core library

7 MyTag core

8 1.0

9

10

11 kingdom

12

14 http://www.kingdom.com/mytag/core

15

16 hello

17 com.kingdom.tag.HelloTag

18 empty

19

20

View Code

測試頁面:Test.jsp

1

2 pageEncoding="UTF-8"%>

3

4

5

6

7

8

Insert title here

9

10

11

12

13

View Code

方法說明

1、setJspContext: 一定會被 JSP 引擎所調用, 先于 doTag, 把代表 JSP 引擎的 pageContext 傳給標簽處理器類.

注意:PageContext可以獲取jsp頁面的其他8個隱含對象

privatePageContext pageContext;

@Overridepublic voidsetJspContext(JspContext arg0) {

System.out.println(arg0instanceofPageContext);this.pageContext =(PageContext) arg0;

}

2、doTage:標簽體邏輯實現,類似于Service方法

3、setXXX:當自定義標簽中有屬性,則jsp引擎會自動調用這種方法為標簽處理類中的屬性賦值

注意調用順序:setJspContext -->setXXX-->doTage

JspFrament:代表標簽體內容

示例:自定義帶屬性的自定義標簽

建議將屬性定義為String類型

兩個注意點

1、在標簽處理類中添加屬性,例如:

privateString value ;privateString count ;public voidsetValue(String value) {this.value =value;

}public voidsetCount(String count) {this.count =count;

}

2、在標簽庫描述文件中,添加對屬性的描述,例如:

value

true

true

count

false

false

HelloTag.java:實現SimpTag接口

1 importjava.io.IOException;2 importjavax.servlet.http.HttpServletRequest;3 importjavax.servlet.jsp.JspContext;4 importjavax.servlet.jsp.JspException;5 importjavax.servlet.jsp.JspWriter;6 importjavax.servlet.jsp.PageContext;7 importjavax.servlet.jsp.tagext.JspFragment;8 importjavax.servlet.jsp.tagext.JspTag;9 importjavax.servlet.jsp.tagext.SimpleTag;10 public class HelloTag implementsSimpleTag {11 privateString value ;12 privateString count ;13 public voidsetValue(String value) {14 this.value =value;15 }16 public voidsetCount(String count) {17 this.count =count;18 }19 @Override20 public void doTag() throwsJspException, IOException {21 //System.out.println("value:" + value + ",count:" + count);22 //System.out.println("doTag");23 //HttpServletRequest request = (HttpServletRequest)pageContext.getRequest() ;24 //this.pageContext.getOut().print("HelloWorld:" + request.getParameter("name"));

25 JspWriter out =pageContext.getOut() ;26 int c = 0;27 c =Integer.parseInt(count) ;28 for(int i=0 ;i");31 }32 }33 @Override34 public voidsetParent(JspTag parent) {35 System.out.println("setParent");36 }37 @Override38 publicJspTag getParent() {39 System.out.println("getParent");40 return null;41 }42 privatePageContext pageContext ;43 @Override44 public voidsetJspContext(JspContext pc) {45 System.out.println("setJspContext");46 this.pageContext =(PageContext) pc ;47 }48 @Override49 public voidsetJspBody(JspFragment jspBody) {50 System.out.println("setJspBody");51 }52 }

View Code

mytag.tld

1

2 hello

3 com.kingdom.tag.HelloTag

4 empty

5

6 value

7

8 true

9

13 true

14

15

16 count

17 false

18 false

19

20

View Code

helloTag.jsp

1

2 pageEncoding="UTF-8"%>

3

4

5

6

7

8

Insert title here

9

10

11

12

13

View Code

示例:

制定一個帶有屬性的標簽,用于輸出指定文件的內容

標簽處理類

1 importjava.io.BufferedReader;2 importjava.io.IOException;3 importjava.io.InputStream;4 importjava.io.InputStreamReader;5 importjava.util.regex.Pattern;6

7 importjavax.servlet.jsp.JspException;8 importjavax.servlet.jsp.PageContext;9 importjavax.servlet.jsp.tagext.SimpleTagSupport;10

11 public class ReadFileTag extendsSimpleTagSupport{12

13 //相對于當前 WEB 應用的根路徑的文件名

14 privateString src;15

16 public voidsetSrc(String src) {17 this.src =src;18 }19

20 @Override21 public void doTag() throwsJspException, IOException {22 PageContext pageContext =(PageContext) getJspContext();23 InputStream in =pageContext.getServletContext().getResourceAsStream(src);24 BufferedReader reader = new BufferedReader(newInputStreamReader(in));25

26 String str = null;27 while((str = reader.readLine()) != null){28

29 str = Pattern.compile("").matcher(str).replaceAll("&gt");31

32 pageContext.getOut().println(str);33 pageContext.getOut().println("
");34 }35 }36

37 }

View Code

注意:通常情況下開發簡單標簽直接繼承 SimpleTagSupport 就可以了

帶標簽體的自定義標簽

JSPFragment對象

1、在自定義標簽的標簽處理器中使用 JspFragment 對象封裝標簽體信息

2、若配置了標簽含有標簽體, 則 JSP 引擎會調用 setJspBody() 方法把 JspFragment 傳遞給標簽處理器類

在 SimpleTagSupport 中還定義了一個 getJspBody() 方法, 用于返回 JspFragment 對象

3、JspFragment 的 invoke(Writer) 方法: 把標簽體內容從 Writer 中輸出, 若為 null,則等同于 invoke(getJspContext().getOut()), 即直接把標簽體內容輸出到頁面上

示例:將標簽體中的字符變成大寫

標簽處理類

1 importjava.io.IOException;2 importjava.io.OutputStreamWriter;3 importjava.io.PrintWriter;4 importjava.io.StringWriter;5

6 importjavax.servlet.jsp.JspException;7 importjavax.servlet.jsp.tagext.JspFragment;8 importjavax.servlet.jsp.tagext.SimpleTagSupport;9

10 public class TestJspFragment extendsSimpleTagSupport {11

12 @Override13 public void doTag() throwsJspException, IOException {14 JspFragment bodyContent =getJspBody();15 //JspFragment.invoke(Witer): Writer 即為標簽體內容輸出的字符流, 若為 null, 則16 //輸出到 getJspContext().getOut(), 即輸出到頁面上.17

18 //1. 利用 StringWriter 得到標簽體的內容.

19 StringWriter sw = newStringWriter();20 bodyContent.invoke(sw);21

22 //2. 把標簽體的內容都變為大寫

23 String content =sw.toString().toUpperCase();24

25 //3. 獲取 JSP 頁面的 out 隱含對象, 輸出到頁面上

26 getJspContext().getOut().print(content);27 }28

29 }

View Code

利用IO流中StringWriter類存儲標簽體的內容

StringWriter sw = newStringWriter();

bodyContent.invoke(sw);

標簽描述文件

body-content 節點描述標簽體的類型:

: 指定標簽體的類型, 大部分情況下, 取值為 scriptless即可。可能取值有 3 種:

1、empty: 沒有標簽體

2、scriptless: 標簽體可以包含 el 表達式和 JSP 動作元素,但不能包含 JSP 的腳本元素

3、tagdependent: 表示標簽體交由標簽本身去解析處理。若指定 tagdependent,在標簽體中的所有代碼都會原封不動的交給標簽處理器,而不是將執行結果傳遞給標簽處理器

帶父標簽的自定義標簽

1、父標簽無法獲取子標簽的引用, 父標簽僅把子標簽作為標簽體來使用.

2、 子標簽可以通過 getParent() 方法來獲取父標簽的引用(需繼承 SimpleTagSupport 或自實現 SimpleTag 接口的該方法):若子標簽的確有父標簽, JSP 引擎會把代表父標簽的引用通過? setParent(JspTag parent)? 賦給標簽處理器

注意: 父標簽的類型是 JspTag 類型. 該接口是一個空接口, 但是來統一 SimpleTag 和 Tag 的. 實際使用需要進行類型的強制轉換.

3、 在 tld 配置文件中, 無需為父標簽有額外的配置. 但, 子標簽是是以標簽體的形式存在的, 所以父標簽的

需設置為 scriptless

示例:

父標簽處理類

1 importjava.io.IOException;2

3 importjavax.servlet.jsp.JspException;4 importjavax.servlet.jsp.tagext.SimpleTagSupport;5

6 public class ParentTag extendsSimpleTagSupport{7

8 private String name = "atguigu";9 publicString getName() {10 returnname;11 }12

13 @Override14 public void doTag() throwsJspException, IOException {15 System.out.println("父標簽的處理器類name:" +name);16 getJspBody().invoke(null);17 }18 }

View Code

子標簽處理類

1 importjava.io.IOException;2

3 importjavax.servlet.jsp.JspException;4 importjavax.servlet.jsp.tagext.JspTag;5 importjavax.servlet.jsp.tagext.SimpleTagSupport;6

7 public class SonTag extendsSimpleTagSupport {8

9 @Override10 public void doTag() throwsJspException, IOException {11 //1.得到父標簽的引用

12 JspTag parent =getParent() ;13 //2.獲取父標簽的name屬性

14 ParentTag parentTag =(ParentTag) parent ;15 String name =parentTag.getName() ;16

17 //3.把name 值打印到JSP 頁面上

18 getJspContext().getOut().print("子標簽輸出name:" +name);19

20 }21

22 }

View Code

zwy

總結

以上是生活随笔為你收集整理的java自定义jsp标签_Javaweb自定义jsp标签的全部內容,希望文章能夠幫你解決所遇到的問題。

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