09.javaweb简单标签编程
一、简单标签
1, 简介:由于传统标签使用三个标签接口来完成不同的功能,显得过于繁琐,不利于标签技术的推广, SUN公司为降低标签技术的学习难度,在JSP 2.0中定义了一个更为简单、便于编写和调用的SimpleTag接口来实现标签的功能。
2, 实现SimpleTag接口的标签称为简单标签。简单标签共有五个方法
setJspContext方法:用于把JSP页面的pageContext对象传递给标签处理器对象
setParent方法:用于把父标签处理器对象传递给当前标签处理器对象
getParent方法:用于获得当前标签的父标签处理器对象
setJspBody方法:用于把代表标签体的JspFragment对象传递给标签处理器对象
doTag方法:
用于完成所有的标签逻辑,包括输出、迭代、修改标签体内容等。在doTag方法中可以抛出 javax.servlet.jsp.SkipPageException异常,用于通知WEB容器不再执行JSP页面中位于结束标记后面的内容,这等效于在传统标签的doEndTag方法中返回Tag.SKIP_PAGE常量的情况。
3, web容器执行简单标签的步骤
a.WEB容器调用标签处理器对象的setJspContext方法,将代表JSP页面的pageContext对象传递给标签处理器对象。
b.WEB容器调用标签处理器对象的setParent方法,将父标签处理器对象传递给这个标签处理器对象。注意,只有在标签存在父标签的情况下,WEB容器才会调用这个方法。
c.如果调用标签时设置了属性,容器将调用每个属性对应的setter方法把属性值传递给标签处理器对象。如果标签的属性值是EL表达式或脚本表达式,则WEB容器首先计算表达式的值,然后把值传递给标签处理器对象。
d.如果简单标签有标签体,WEB容器将调用setJspBody方法把代表标签体的JspFragment对象传递进来。
e.执行标签时WEB容器调用标签处理器的doTag()方法,开发人员在方法体内通过操作JspFragment对象,就可以实现是否执行、迭代、修改标签体的目的。
4,简单标签实例:sun公司针对SimpleTag接口提供了一个默认实现类SimpleTagSupport,继承这个类则可以完成简单标签开发
4.1编写标签处理器类
package com.chen.ying;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class SimpleTagDemo01 extends SimpleTagSupport {
public void doTag()throws JspException,IOException{
//得到代表标签体的JspFragment用以操作标签体;
JspFragment jfm=this.getJspBody();
jfm.invoke(null);//默认将标签体内容输出到浏览器
}
}
4.2在标签库中配置标签

4.3在jsp中使用

5,控制标签体内容重复执行
5.1编写标签处理类
package com.chen.ying;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class SimpleTagDemo02 extends SimpleTagSupport {
public void doTag()throws JspException,IOException{
//得到代表标签体的JspFragment用以操作标签体;
JspFragment jfm=this.getJspBody();
for(int i=1;i<=3;i++){
jfm.invoke(null);//默认将标签体内容重复输出到浏览器
}
}
}
6,修改jsp内容并输出
6.1编写标签处理器类,将标签体内容转换成大写
public class SimpleTagDemo03 extends SimpleTagSupport {
public void doTag()throws JspException,IOException{
//得到代表标签体的JspFragment用以操作标签体;
JspFragment jfm=this.getJspBody();
StringWriter sw=new StringWriter();//String流
jfm.invoke(sw);//将标签体输出到String流中
String content=sw.getBuffer().toString();//得到流中内容
content=content.toUpperCase();//转换成大写
PageContext pageContext=(PageContext)this.getJspContext();
//将修改后的content输出到浏览器中
pageContext.getOut().write(content);
}
}
7,控制整个jsp页面是否执行
编写一个类继承SimpleTagSupport,然后再重写doTag方法,在doTag方法抛出SkipPageException异常即可,jsp收到这个异常,将忽略标签余下jsp页面的执行。
public void doTag() throws JspException, IOException {
//抛出一个SkipPageException异常就可以控制标签之后的Jsp不执行
throw new SkipPageException();
}
8,JspFragment类
javax.servlet.jsp.tagext.JspFragment类的实例对象代表jsp中一段不包括jsp脚本元素的片段。WEB容器在处理简单标签的标签体时,会把标签体内容用一个JspFragment对象表示,并调用标签处理器对象的setJspBody方法把JspFragment对象传递给标签处理器对象。JspFragment有两个方法
getJspContext(),返回代表调用页面的JspContext()对象
public abstract void invoke(java.io.Writer out)
用于执行JspFragment对象所代表的JSP代码片段,参数out用于指定将JspFragment对象的执行结果写入到哪个输出流对象中,如果 传递给参数out的值为null,则将执行结果写入到JspContext.getOut()方法返回的输出流对象中。(简而言之,可以理解为写给浏览器)
Invoke方法详解
JspFragment.invoke方法是JspFragment最重要的方法,利用这个方法可以控制是否执行和输出标签体的内容、是否迭代执行标签体的内容或对标签体的执行结果进行修改后再输出。例如:
在标签处理器中如果没有调用JspFragment.invoke方法,其结果就相当于忽略标签体内容;
在标签处理器中重复调用JspFragment.invoke方法,则标签体内容将会被重复执行;
若想在标签处理器中修改标签体内容,只需在调用invoke方法时指定一个可取出结果数据的输出流对象(例如StringWriter),让标签体的执行结果输出到该输出流对象中,然后从该输出流对象中取出数据进行修改后再输出到目标设备,即可达到修改标签体的目的。
9,带属性的简单标签开发
简单标签的属性设置与传统标签的属性设置类似。需要注意的是如果标签的属性值是8种基本数据类型,那么在JSP页面在传递字符串时,JSP引擎会自动转换成相应的类型,但如果标签的属性值是复合数据类型,那么JSP引擎是无法自动转换的
下面研究如何为复合数据类型的属性值赋值:

上面对一个日期类型的属性赋值,可以用表达式语言或表达式给属性赋值。
10,DynamicAttribute接口:使用此接口,可以接收动态属性
此接口只有一个接收动态属性的方法,当标签中含有未在标签库配置的动态属性时便会循环调用此方法
public void setDynamicAttribute(String uri, String localName, Object value) throws JspException {
}
10.1编写一个标签处理类,可以接收动态填写的属性,并将属性相加值输出到浏览器
public class SimpleTagDemo04 extends SimpleTagSupport implements DynamicAttributes{
private Map<String,Float> map=new HashMap<String,Float>();
public void doTag()throws JspException,IOException{
Float sum=0.0f;
for(Map.Entry<String, Float> m:map.entrySet()){
sum+=m.getValue();//将map中的属性值累加
}
super.getJspContext().getOut().write(sum+"");//输出到浏览器
}
public void setDynamicAttribute(String uri, String localName, Object value) throws JspException {
//循环执行此函数,接收动态属性
map.put(localName,Float.parseFloat(value.toString()));
}
}
10.2在标签库中配置此标签

10.3在jsp使用此标签

结果

二、 标签开发细节
1,开发简单标签类时,不要直接去实现SimpleTag接口,而是应该继承SimpleTagSupport类,SimpleTagSupport类是 SimpleTag接口的一个默认实现类,通过继承SimpleTagSupport类,就可以直接使用SimpleTagSupport类已经实现的那 些方法,如果SimpleTagSupport类的方法实现不满足业务要求,那么就可以根据具体的业务情况将相应的方法进行重写。
2,tld文件中有四种标签体(body-content)类型 :empty、JSP、scriptless、tagdependent
在简单标签(SampleTag)中标签体body-content的值只允许是empty、scriptless、tagdependent,不允许设置成JSP,如果设置成JSP就会出现异常: jsp标签技术出现的目的就是为了移除在jsp页面上编写的java代码的,如果在jsp标签中允许出现java代码,那么就违背了jsp标签技术设计时的初衷了。所以在简单标签的标签体中是不允许出现java代码的。
如果标签体body-content的值设置成tagdepentend,那么就表示标签体里面的内容是给标签处理器类使用的,
例如:开发一个查询用户的sql标签,此时标签体中的SQL语句就是给SQL标签的标签处理器来使用的
<gacl:sql>SELECT * FROM USER</gacl:sql>
3,如果有两个标签库的uri相同,则不能简单地通过uri引用标签库,可通过uri=”标签库tld目录”区分
<%@taglib uri="/WEB-INF/gacl.tld" prefix="gacl"%>、
<%@taglib uri="/WEB-INF/simpletag.tld" prefix="gacl"%>
三、小结
1、编写一个类继承SimpleTagSupport类,然后根据业务需要重写SimpleTagSupport类中已经实现了的方法,一般情况下只需要重写doTag()方法即可。
2、在WEB-INF目录下创建一个tld文件,在tld文件中添加对该标签的描述。tld文件不一定放在WEB-INF目录下,也可以放在别的目录,习惯是放在WEB-INF目录下。
09.javaweb简单标签编程的更多相关文章
- 传智播客JavaWeb day07、day08-自定义标签(传统标签和简单标签)、mvc设计模式、用户注册登录注销
第七天的课程主要是讲了自定义标签.简单介绍了mvc设计模式.然后做了案例 1. 自定义标签 1.1 为什么要有自定义标签 前面所说的EL.JSTL等技术都是为了提高jsp的可读性.可维护性.方便性而取 ...
- javaweb学习总结(二十七)——jsp简单标签开发案例和打包
一.开发标签库 1.1.开发防盗链标签 1.编写标签处理器类:RefererTag.java 1 package me.gacl.web.simpletag; 2 3 import java.io.I ...
- javaweb学习总结(二十六)——jsp简单标签标签库开发(二)
一.JspFragment类介绍 javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段, ...
- javaweb学习总结(二十五)——jsp简单标签开发(一)
一.简单标签(SimpleTag) 由于传统标签使用三个标签接口来完成不同的功能,显得过于繁琐,不利于标签技术的推广, SUN公司为降低标签技术的学习难度,在JSP 2.0中定义了一个更为简单.便于编 ...
- JavaWeb学习记录(十九)——jstl自定义标签之简单标签
一.简单标签共定义了5个方法: setJspContext方法 setParent和getParent方法 setJspBody方法 doTag方法 二.方法介绍 osetJspContext方法 用 ...
- 我给女朋友讲编程html系列(4) -- html常用简单标签
今天似乎有点感冒,浑身无力,在操场上躺了半个小时,好了许多.好了,废话不说了,还是写今天的教程吧. 1,html中的换行标签是 br,写法是: <br /> 2,html中有一些特殊的字符 ...
- javaweb(二十六)——jsp简单标签标签库开发(二)
一.JspFragment类介绍 javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段, ...
- jsp简单标签开发(一)
孤傲苍狼 @Override22 public void doTag() throws JspException, IOException {23 //得到代表jsp标签体的JspFragment24 ...
- java web 学习笔记 - JSP标签编程
1.JSP标签编程简介 标签编程在开发中并不常见,主要是为了更好的理解struts等框架的标签而打基础,完善相关知识体系. 标签编程分为: 一个继承自TagSupport的标签类,一个在WEB-INF ...
随机推荐
- 关于Arrays协助类中的排序方法
sort方法是优化的快速排序,不稳定. paralleSort是多线程排序,稳定,但是有长度限制.
- nyoj23-取石子(一)
取石子(一) 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 一天,TT在寝室闲着无聊,和同寝的人玩起了取石子游戏,而由于条件有限,他/她们是用旺仔小馒头当作石子.游戏的 ...
- 当svn检出项目检出一半时停止,如何继续检出
1.当svn检出项目时,发现中断,又不想重新检出可以在已检出的项目目录下右键 2.然后点击 之后直接update你的项目就可以了
- SQL中的条件判断语句(case when zhen if,ifnull)用法
简介: case具有两种格式.简单case函数和case搜索函数.这两种方式,可以实现相同的功能.简单case函数的写法相对比较简洁,但是和case搜索函数相比,功能方面会有些限制,比如写判定式.还有 ...
- C#学习笔记_05_输入输出
05_输入输出 输出语句 Console.WriteLine( ); 将括号内内容输出到控制台,并且换行 Console.Write( ); 将括号内内容输出到控制台,不换行 Console.Writ ...
- numpy中sum(axis=0)和axis=1的计算原理
看起来挺简单的样子,但是在给sum函数中加入参数.sum(a,axis=0)或者是.sum(axis=1) 就有点不解了 在我实验以后发现 我们平时用的sum应该是默认的axis=0 就是普通的相加 ...
- C# 利用 Time 组件实现 Button 控件的长按功能
参考链接:https://blog.csdn.net/yongh701/article/details/50134379 如果在C#窗体,单纯点击按钮,之后将鼠标长时间放在这个按钮上,不放开,双击按钮 ...
- 【Codeforces Round #519 by Botan Investments D】Mysterious Crime
[链接] 我是链接,点我呀:) [题意] 相当于问你这m个数组的任意长度公共子串的个数 [题解] 枚举第1个数组以i为起点的子串. 假设i..j是以i开头的子串能匹配的最长的长度. (这个j可以给2. ...
- Ngnix--知识点
ngnix擅长负载 均衡的反向代理 haproxy擅长高可用的反向代理,这个还支持TCP协议 ngnix只能支持HTTP和Email(这个HTTPS需要核实一下) ngnix和haproxy都需要ke ...
- C#--线程存储数据的机制
面试题:线程存储数据的机制 Local variables 局部变量 临时存储 栈 Instance class fields 对象存储 堆 (堆的大小只有硬件的限制) Static local va ...