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(">");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标签相关推荐
- java web编写计算器_javaWeb 使用 jsp 和 javaBean 实现计算器功能
jsp 和 javaBean 实现计算器功能 try { calculator.calculate(); } catch (Exception e) { out.write(e.getMessage( ...
- java ee jsp_EE JSP:使用自定义标签库生成动态内容
java ee jsp 在Web应用程序中开发View层时,您希望尽量不要重复JSP文件中的内容. JSP spec API允许您通过使用标记库来减少这种重复. 定制JSP标记是用户定义的xml标记元 ...
- java jsp 自定义标签_JSP自定义标签
在本章中,我们将讨论JSP中的自定义标签.自定义标签是用户定义的JSP语言元素.当包含自定义标签的JSP页面被转换成一个servlet时,标签被转换为一个名为标签处理程序的对象的操作. 然后,Web容 ...
- JSP标签:jsp内置标签、jstl标签、自定义标签
一.jsp标签的分类: 1)内置标签(动作标签): 不需要在jsp页面导入标签 2)jstl标签: 需要在jsp页面中导入标签 3)自定义标签 : 开发者自行定义,需要在jsp页面导入标签 1 ...
- java web 自定义标签_JavaWeb学习——自定义标签
自定义标签 一.自定义标签概述 使用标准JSP访问.操作JavaBean,是实现展现(HTML)与业务实现(Java代码)分离的第一步.然而,标准方法功能不够强大,以至于开发者无法仅仅使用它们开发应用 ...
- 深入体验JavaWeb开发内幕——简述JSP中的自定义标签叫你快速学会
转载自 深入体验JavaWeb开发内幕--简述JSP中的自定义标签叫你快速学会 自定义标签,顾名思义,就是自己定义的标签.那么我们为什么要自己定义一些标签呢? 我们知道,如果要在JSP中获取数据我 ...
- EE JSP:使用自定义标签库生成动态内容
在Web应用程序中开发View层时,您希望尽量不要重复JSP文件中的内容. JSP spec API允许您通过使用标记库来减少这种重复. 定制JSP标记是用户定义的xml标记元素,您可以将其插入JSP ...
- JSP笔记——7.自定义标签
jsp标签具有与html标签一样的格式,可以用来代替jsp中的Java脚本,使代码简介.使用自定义标签之前需要建立一个*.tld文件,每个文件对应一个标签库,里面可以包含很多的自定义标签. 每一个标签 ...
- 自定义标签的使用jsp实例_JSP自定义标签示例教程
自定义标签的使用jsp实例 Today we will look into JSP custom tags. Earlier we learned about JSP Action Elements, ...
最新文章
- 高德渲染网关Go语言重构实践
- jQuery版本不同及多次引用问题
- “RPC好,还是RESTful好?”
- 硕士本科论文通过matlab出仿真图
- Linux学习之系统编程篇:管道设置为非阻塞及管道的读写行为
- jar包让别人看不到代码_【求助】反编译查看jar包的源代码,出现如下问题,求解单...
- poj1753 Flip Game
- Java的反射(二)
- 技术人不会学习,35 岁必然要焦虑!
- 编译原理教程_6 LR分析法
- (四轴)无人机工作原理及组成
- mysql压缩包部署和常见问题
- 视频分配器中提高信号完整性的方法
- 输入时(hour)、分(minute)、秒(second)的一个具体时间,要求打印出它的下一秒出来(一天24小时)。 例如输入的是23时59分59秒,则输出00:00:00
- android 视频预览,预览视频 | Android 开发者 | Android Developers
- android 打开和关闭输入法
- 并发编程系列之AQS实现原理
- cxxxxx和xxxxx.h的区别
- 番茄工作法总结-第六章:应变
- “数字资产”这个词可能是误导 | 正本清源谈区块链
热门文章
- sklearn支持gpu_Keras Sklearn随机搜索GPU OOM
- pic单片机内部时钟校准c语言,实例讲解PIC单片机的时钟设置
- 二叉树的先序遍历和非递归遍历
- 推荐系统笔记(评价指标及效果)
- 定位相关论文-A Novel Pedestrian Dead Reckoning Algorithm for Multi-Mode Recognition Based on Smartphones
- conda环境下如何升级python?
- DQN 笔记 State-action Value Function(Q-function)
- 文巾解题 116. 填充每个节点的下一个右侧节点指针
- MATLAB从入门到精通-MATLAB结构矩阵的输出
- Python编程基础:第四十五节 方法链Method Chaining