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 ...
随机推荐
- [51Nod1446] 限制价值树 (容斥+MT定理+折半搜索)
传送门 Description 有N个点(N<=40)标记为0,1,2,...N-1,每个点i有个价值val[i],如果val[i]=-1那么这个点被定义为bad,否则如果val[i] > ...
- [luogu2679] 子串 (多维dp)
传送门 Description 有两个仅包含小写英文字母的字符串 A 和 B . 现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来 ...
- fastadmin 接口(上传)
/** * 添加注释指南 * */ public function store(Request $request) { dump($request);exit; $name = $request-&g ...
- 【例题 4-5 uva 512】Spreadsheet Tracking
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 每个操作对与一个点来说变化是固定的. 因此可以不用对整个数组进行操作. 对于每个询问,遍历所有的操作.对输入的(x,y)进行相应的变 ...
- [bzoj1218][HNOI2003]激光炸弹_暴力
激光炸弹 bzoj-1218 HNOI-2003 题目大意:在笛卡尔坐标系上有n个点,问一个平行于坐标轴的r*r的正方形可以最多覆盖多少个目标. 注释:$1\le n \le 10000$,$1\le ...
- Java 代理学习笔记
http://blog.csdn.net/mr_seaturtle_/article/details/52686516
- hdu 1239
首先,p,q>=2,所以p,q<=50000; 然后,我们观察a<=b<1000,而p,q<=100000.那么,q>=10000时,p<=10,则a/b&l ...
- [Javascript Crocks] Flatten Nested Maybes with `chain`
Sometimes, we run into situations where we end up with a Maybe within the context of another Maybe. ...
- WindowsclientC/C++编程规范“建议”——函数
1 函数 1.1 代码行数控制在80行及以内 等级:[要求] 说明:每一个函数的代码行数控制应该控制在80行以内.假设超过这个限制函数内部逻辑一般能够拆分.假设试图超过这个标准.请列出理由. 但理由不 ...
- Linux命令(五)——磁盘操作及文件系统的管理
文件系统是所有文件夹和文件的基础,磁盘是文件系统的基础,文件系统以磁盘为基础存储文件. 一.linux文件系统类型 1.ext扩展文件系统/ext2二级扩展文件系统/ext3日志式文件系统(默认) 2 ...