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 ...
随机推荐
- Monkey基本常用命令整理
adb shell monkey -v 500 >F:/monkeylog2018.txt -P表示包名 -V表示输出日志的详细级别 一个-V表示一级 递增 >输出日志 ...
- PHP循环输出二维数组的数据
//下面是一个例子$g_id = isset($_GET['id'])?$_GET['id']:'1';//定义变量$g_id,使用三元运算符是为了避免出现waring $p_id = ($g_id& ...
- python3实现UDP协议的简单服务器和客户端
利用python中的socket模块中的来实现UDP协议,这里写一个简单的服务器和客户端.为了说明网络编程中UDP的应用,这里就不写图形化了,在两台电脑上分别打开UDP的客户端和服务端就可以了. UD ...
- AtCoder ARC 082E - ConvexScore
传送门:http://arc082.contest.atcoder.jp/tasks/arc082_c 本题是一个平面几何问题. 在平面直角坐标系中有一个n元点集U={Ai(xi,yi)|1≤i≤n} ...
- SpringCloud Config 分布式配置中心
一.分布式系统面临的问题---配置问题 微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量服务.由于每个服务都需要必要的配置信息才能运行,所以一套集中式的 ...
- faster-rcnn代码阅读1
毫无疑问,faster-rcnn是目标检测领域的一个里程碑式的算法.本文主要是本人阅读python版本的faster-rcnn代码的一个记录,算法的具体原理本文也会有介绍,但是为了对该算法有一个整体性 ...
- 万众创业,互联网+,WTO
WTO的保护期,发展的非常繁荣.但大部分的资源都配置在了房地产这个支柱产业, 而被保护的行业小日子过得不错, 研发再投入?那是傻子才做的事情,别墅.豪车.美女.这才是生活. 但突然有一天,发现保护期要 ...
- 如何构建一个轻量级级的DI(依赖注入)
概念:依赖注入与IOC模式类似工厂模式,是一种解决调用者和被调用者依赖耦合关系的模式:它解决了对象之间的依赖关系,使得对象只依赖IOC/DI容器,不再直接相互依赖,实现松耦合,然后在对象创建时,由IO ...
- HTTP详解工作原理
1. HTTP简介 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议.它可以使浏览器更加高效,使网络传输减少. ...
- 关于PHP浮点数之 intval((0.1+0.7)*10) 为什么是7
PHP是一种弱类型语言, 这样的特性, 必然要求有无缝透明的隐式类型转换, PHP内部使用zval来保存任意类型的数值, zval的结构如下(5.2为例): struct _zval_struct { ...