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

本文详细介绍了Java中自定义JSP标签的开发与应用步骤,包括编写标签处理器、创建标签库描述文件(TLD),并在JSP页面中使用自定义标签。通过示例解释了如何实现无标签体、带属性、带标签体的自定义标签,并讨论了标签处理类的生命周期及方法。同时,还探讨了带父标签的自定义标签的实现方式。
摘要由CSDN通过智能技术生成

自定义标签

用户定义的一种自定义的jsp标记,当一个含有自定义标签的jsp页面被jsp引擎编译成Servlet时,tag标签被转化成了对一个称为标签处理类的对象的操作。于是当jsp页面被jsp引擎转化为Servlet后,实际上tag标签被转化为对tag处理类的操作

自定义标签的开发与应用步骤

1、编写标签处理器:能够完成标签功能的java类,继承SimpleTagSupport类

2、编写标签库描述(tld)文件,在tld文件中对自定义标签进行描述:建议该文件放在WEB-INF下

3、在jsp页面中导入和使用自定义标签

标签处理类的生命周期

69b6725645f9b104e38a05b26b896d38.png

示例:自定义简单标签hello

没有标签体和属性

标签处理类: HelloTag.java,实现SimpleTag接口

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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接口

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1

2 pageEncoding="UTF-8"%>

3

4

5

6

7

8

Insert title here

9

10

11

12

13

View Code

示例:

制定一个带有属性的标签,用于输出指定文件的内容

标签处理类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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()), 即直接把标签体内容输出到页面上

示例:将标签体中的字符变成大写

标签处理类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

示例:

父标签处理类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

子标签处理类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值