JSP简单标签开发
一、继承自SimpleTag接口的自定义标签实现类称为简单标签,接口中5个方法
1、setJspContext方法
用于把JSP页面的PageContext对象传递给标签处理器对象
2、setParent方法
把父标签处理器对象传递给当前处理器对象
3、getParent方法
用于获取当前标签的父标签处理器对象
4、setJspBody方法
用于把代表标签体的JspFragment对象传递给标签处理器对象
5、doTag方法
用于完成所有标签逻辑,如输出、迭代、修改标签内容等。在方法中可以通过抛出javax.servlet.jsp.SkipPageException异常,通知WEB容器不再执行当前标签结束标记后面代码,等效于doTagEnd方法的返回值常量Tag.SKIP__PAGE
二、SimpleTag接口方法在WEB容器中执行顺序
1、调用setJspContext方法,将代表JSP页面的pageContext对象传递给标签处理器对象
2、如果当前标签有父级标签,调用setParent方法将父标签处理器对象传递给当前标签处理器对象
3、如果当前标签有属性,则调用每个属性的setter方法,将属性值传递给标签处理器对象;如果属性是EL表达式或脚本表达式,则WEB容器优先计算表达式,然后把值传递给标签处理器对象
4、简单标签有标签体,则调用setJspBody方法,把代表标签体的JspFragment对象传递给标签处理器
5、WEB容器执行doTag方法,通过操作JspFragment对象,实现标签体是否执行、迭代、修改标签体内容等操作
三、例子,开发中经常继承自SimpleTagSupport类
1、控制标签体是否执行,不调用invoke方法则不执行标签体
package TagDemo; import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException; public class SimpleTagDemo extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
JspFragment fragment = this.getJspBody();//获取标签体
// PageContext pageContext= (PageContext) fragment.getJspContext();
// fragment.invoke(pageContext.getOut());
fragment.invoke(null);
}
}
控制标签体是否执行
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>自定义标签</description> <tlib-version>1.0</tlib-version> <short-name>SDT</short-name> <uri>/sefDefineTag</uri>
<tag>
<name>tagDemo</name>
<tag-class>TagDemo.TagDemo</tag-class>
<body-content>JSP</body-content>
</tag>
<tag>
<description>测试循环</description>
<name>iteration</name>
<tag-class>TagDemo.IterationTagDemo</tag-class>
<body-content>JSP</body-content>
</tag>
<tag>
<description>测试修改标签体内容</description>
<name>bodytag</name>
<tag-class>TagDemo.BodyTagDemo</tag-class>
<body-content>JSP</body-content>
</tag>
<tag>
<name>simpleTag</name>
<tag-class>TagDemo.SimpleTagDemo</tag-class>
<!--简单标签中,body-content中一般设置成empty或scriptless,如果设置成JSP会抛异常;
传统标签中,body-content中一般设置成empty或JSP;
如果body-content设置成tagdependent,那么标签体里的内容是给标签处理类使用的,
例如:标签体里的SQL语句,就可以设置成tagdependent,标签处理器类得到SQL语句处理-->
<body-content>scriptless</body-content>
</tag>
</taglib>
tld文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="sdt" uri="/sefDefineTag" %>
<html>
<head>
<title></title>
</head>
<body>
<h1>下面是自定义标签:</h1>
<h6>---------------------------------------------</h6> <sdt:tagDemo>标签体</sdt:tagDemo>
<br/>
<br/>
<sdt:iteration>循环标签体5次<br/></sdt:iteration>
<br/>
<br/>
<sdt:bodytag>abc</sdt:bodytag>
<br/>
<br/>
<sdt:simpleTag>简单标签体</sdt:simpleTag>
<h6>---------------------------------------------</h6>
<div>
<h1>自定义标签下面内容</h1>
</div>
</body>
</html>
JSPDemo
2、标签体循环执行,doTag中循环调用invoke方法
package TagDemo; import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException; public class SimpleIterationTagDemo extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
JspFragment fragment = this.getJspBody();
for (int i = 0; i < 5; i++) {
fragment.invoke(null);
}
}
}
标签体循环执行5次
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>自定义标签</description> <tlib-version>1.0</tlib-version> <short-name>SDT</short-name> <uri>/sefDefineTag</uri>
<tag>
<name>tagDemo</name>
<tag-class>TagDemo.TagDemo</tag-class>
<body-content>JSP</body-content>
</tag>
<tag>
<description>测试循环</description>
<name>iteration</name>
<tag-class>TagDemo.IterationTagDemo</tag-class>
<body-content>JSP</body-content>
</tag>
<tag>
<description>测试修改标签体内容</description>
<name>bodytag</name>
<tag-class>TagDemo.BodyTagDemo</tag-class>
<body-content>JSP</body-content>
</tag>
<tag>
<name>simpleTag</name>
<tag-class>TagDemo.SimpleTagDemo</tag-class>
<!--简单标签中,body-content中一般设置成empty或scriptless,如果设置成JSP会抛异常;
传统标签中,body-content中一般设置成empty或JSP;
如果body-content设置成tagdependent,那么标签体里的内容是给标签处理类使用的,
例如:标签体里的SQL语句,就可以设置成tagdependent,标签处理器类得到SQL语句处理-->
<body-content>scriptless</body-content>
</tag>
<tag>
<name>simpleIterationTag</name>
<tag-class>TagDemo.SimpleIterationTagDemo</tag-class>
<body-content>scriptless</body-content>
</tag>
</taglib>
tld配置文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="sdt" uri="/sefDefineTag" %>
<html>
<head>
<title></title>
</head>
<body>
<h1>下面是自定义标签:</h1>
<h6>---------------------------------------------</h6> <sdt:tagDemo>标签体</sdt:tagDemo>
<br/>
<br/>
<sdt:iteration>循环标签体5次<br/></sdt:iteration>
<br/>
<br/>
<sdt:bodytag>abc</sdt:bodytag>
<br/>
<br/>
<sdt:simpleTag>简单标签体</sdt:simpleTag>
<br/>
<br/>
<sdt:simpleIterationTag>简单标签体循环5次<br/></sdt:simpleIterationTag>
<h6>---------------------------------------------</h6>
<div>
<h1>自定义标签下面内容</h1>
</div>
</body>
</html>
JSPDemo
3、修改标签体内容,通过doTag方法中invoke方法,将标签体写入StringWriter对象中
package TagDemo; import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.JspTag;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
import java.io.StringWriter; public class SimpleBodyTagDemo extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
JspFragment fragment=this.getJspBody();
JspTag parentTag=this.getParent();
StringWriter stringWriter=new StringWriter();
//将标签体内容写到stringwriter流中
fragment.invoke(stringWriter);
//获取stringwriter流缓冲区内容
String content=stringWriter.getBuffer().toString();
content=content.toUpperCase();
PageContext context= (PageContext) this.getJspContext();
//将修改后的content输出到浏览器中
context.getOut().write(content);
}
}
标签体内小写字母转为大写字母
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>自定义标签</description> <tlib-version>1.0</tlib-version> <short-name>SDT</short-name> <uri>/sefDefineTag</uri>
<tag>
<name>tagDemo</name>
<tag-class>TagDemo.TagDemo</tag-class>
<body-content>JSP</body-content>
</tag>
<tag>
<description>测试循环</description>
<name>iteration</name>
<tag-class>TagDemo.IterationTagDemo</tag-class>
<body-content>JSP</body-content>
</tag>
<tag>
<description>测试修改标签体内容</description>
<name>bodytag</name>
<tag-class>TagDemo.BodyTagDemo</tag-class>
<body-content>JSP</body-content>
</tag>
<tag>
<name>simpleTag</name>
<tag-class>TagDemo.SimpleTagDemo</tag-class>
<!--简单标签中,body-content中一般设置成empty或scriptless,如果设置成JSP会抛异常;
传统标签中,body-content中一般设置成empty或JSP;
如果body-content设置成tagdependent,那么标签体里的内容是给标签处理类使用的,
例如:标签体里的SQL语句,就可以设置成tagdependent,标签处理器类得到SQL语句处理-->
<body-content>scriptless</body-content>
</tag>
<tag>
<name>simpleIterationTag</name>
<tag-class>TagDemo.SimpleIterationTagDemo</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>simpleBodyTag</name>
<tag-class>TagDemo.SimpleBodyTagDemo</tag-class>
<body-content>scriptless</body-content>
</tag>
</taglib>
tld文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="sdt" uri="/sefDefineTag" %>
<html>
<head>
<title></title>
</head>
<body>
<h1>下面是自定义标签:</h1>
<h6>---------------------------------------------</h6> <sdt:tagDemo>标签体</sdt:tagDemo>
<br/>
<br/>
<sdt:iteration>循环标签体5次<br/></sdt:iteration>
<br/>
<br/>
<sdt:bodytag>abc</sdt:bodytag>
<br/>
<br/>
<sdt:simpleTag>简单标签体</sdt:simpleTag>
<br/>
<br/>
<sdt:simpleIterationTag>简单标签体循环5次<br/></sdt:simpleIterationTag>
<br/>
<br/>
<sdt:simpleBodyTag>abccde</sdt:simpleBodyTag>
<h6>---------------------------------------------</h6>
<div>
<h1>自定义标签下面内容</h1>
</div>
</body>
</html>
JSPDemo
4、阻止执行标签结束标记符后面所有代码,在doTag方法中抛出javax.servlet.jsp.SkipPageException异常
package TagDemo; import javax.servlet.jsp.JspException;
import javax.servlet.jsp.SkipPageException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException; public class SimpleEndPageTagDemo extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
//抛出SkipPageException异常就可以控制标签余下的JSP不执行
throw new SkipPageException();
}
}
标签结束符后面所有代码不执行
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>自定义标签</description> <tlib-version>1.0</tlib-version> <short-name>SDT</short-name> <uri>/sefDefineTag</uri>
<tag>
<name>tagDemo</name>
<tag-class>TagDemo.TagDemo</tag-class>
<body-content>JSP</body-content>
</tag>
<tag>
<description>测试循环</description>
<name>iteration</name>
<tag-class>TagDemo.IterationTagDemo</tag-class>
<body-content>JSP</body-content>
</tag>
<tag>
<description>测试修改标签体内容</description>
<name>bodytag</name>
<tag-class>TagDemo.BodyTagDemo</tag-class>
<body-content>JSP</body-content>
</tag>
<tag>
<name>simpleTag</name>
<tag-class>TagDemo.SimpleTagDemo</tag-class>
<!--简单标签中,body-content中一般设置成empty或scriptless,如果设置成JSP会抛异常;
传统标签中,body-content中一般设置成empty或JSP;
如果body-content设置成tagdependent,那么标签体里的内容是给标签处理类使用的,
例如:标签体里的SQL语句,就可以设置成tagdependent,标签处理器类得到SQL语句处理-->
<body-content>scriptless</body-content>
</tag>
<tag>
<name>simpleIterationTag</name>
<tag-class>TagDemo.SimpleIterationTagDemo</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>simpleBodyTag</name>
<tag-class>TagDemo.SimpleBodyTagDemo</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>simpleEndPageTag</name>
<tag-class>TagDemo.SimpleEndPageTagDemo</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
tld文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="sdt" uri="/sefDefineTag" %>
<html>
<head>
<title></title>
</head>
<body>
<h1>下面是自定义标签:</h1>
<h6>---------------------------------------------</h6> <sdt:tagDemo>标签体</sdt:tagDemo>
<br/>
<br/>
<sdt:iteration>循环标签体5次<br/></sdt:iteration>
<br/>
<br/>
<sdt:bodytag>abc</sdt:bodytag>
<br/>
<br/>
<sdt:simpleTag>简单标签体</sdt:simpleTag>
<br/>
<br/>
<sdt:simpleIterationTag>简单标签体循环5次<br/></sdt:simpleIterationTag>
<br/>
<br/>
<sdt:simpleBodyTag>abccde</sdt:simpleBodyTag>
<br/>
<br/>
<sdt:simpleEndPageTag></sdt:simpleEndPageTag>
<h6>---------------------------------------------</h6>
<div>
<h1>自定义标签下面内容</h1>
</div>
</body>
</html>
JSPDemo
四、tld文件中body-content四种类型简要说明
简单标签标签体body-content的值只允许是empty,scriptless,tagdependent,不允许是JSP,如果设置成JSP就会抛异常;empty表示没有标签体,scriptless表示可以有标签体,但不能是java代码(即<%java代码%>),tagdependent是给标签处理器类使用的标签体
传统标签标签体body-content的值可以是empty,scriptless,JSP,tagdependent;JSP允许有标签体,内容任意,包括java代码或EL表达式
JSP简单标签开发的更多相关文章
- jsp简单标签开发(一)
孤傲苍狼 @Override22 public void doTag() throws JspException, IOException {23 //得到代表jsp标签体的JspFragment24 ...
- javaweb学习总结(二十五)——jsp简单标签开发(一)
一.简单标签(SimpleTag) 由于传统标签使用三个标签接口来完成不同的功能,显得过于繁琐,不利于标签技术的推广, SUN公司为降低标签技术的学习难度,在JSP 2.0中定义了一个更为简单.便于编 ...
- jsp 简单标签开发
实现simpleTag接口的标签通常称为是简单标签,简单标签一共定义了5个方法 setJspContext方法 setParent方法 getParent方法 setJspBody方法 doTag方法 ...
- javaweb学习总结(二十七)——jsp简单标签开发案例和打包
一.开发标签库 1.1.开发防盗链标签 1.编写标签处理器类:RefererTag.java 1 package me.gacl.web.simpletag; 2 3 import java.io.I ...
- javaweb学习总结(二十四)——jsp传统标签开发
一.标签技术的API 1.1.标签技术的API类继承关系 二.标签API简单介绍 2.1.JspTag接口 JspTag接口是所有自定义标签的父接口,它是JSP2.0中新定义的一个标记接口,没有任何属 ...
- JSP自定义标签开发入门《转》
JSP自定义标签开发入门 一般情况下开发jsp自定义标签需要引用以下两个包 import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; ...
- javaweb(二十四)——jsp传统标签开发
一.标签技术的API 1.1.标签技术的API类继承关系 二.标签API简单介绍 2.1.JspTag接口 JspTag接口是所有自定义标签的父接口,它是JSP2.0中新定义的一个标记接口,没有任何属 ...
- javaweb学习总结(二十六)——jsp简单标签标签库开发(二)
一.JspFragment类介绍 javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段, ...
- JSP简单标签标签库开发
1.定制标签的实现类称为标签处理器,简单标签处理器指实现SimpleTag接口的类,如下图的SimpleTagSupport类,该类为SimpleTag接口的默认实现类. 注:不要直接实现Simple ...
随机推荐
- JS模块规范 前端模块管理器
一:JS模块规范(为了将js文件像java类一样被import和使用而定义为模块, 组织js文件,实现良好的文件层次结构.调用结构) A:CommonJS就是为JS的表现来制定规范,因为js没有模块的 ...
- 在Ubuntu 14.04中安装最新版Eclipse
1.下载eclipse从官网http://www.eclipse.org/downloads/下载Eclipse IDE for Java EE Developers的Linux版本eclipse-S ...
- 【codevs 1565】【SDOI 2011】计算器 快速幂+拓展欧几里得+BSGS算法
BSGS算法是meet in the middle思想的一种应用,参考Yveh的博客我学会了BSGS的模版和hash表模板,,, 现在才会hash是不是太弱了,,, #include<cmath ...
- 状态压缩 HDU4539 郑厂长系列故事——排兵布阵
多组n *m 0不能放1可以放 每个士兵可以攻击到并且只能攻击到与之曼哈顿距离为2的位置以及士兵本身所在的位置. #include<stdio.h> #include<algorit ...
- Eclipse 中 安装 SVN 插件
方法一:使用Eclipse 安装向导安装 1.测试所指环境 Eclipse 4.5/Mars 2.svn 插件的官方网站: http://subclipse.tigris.org 3.打开eclip ...
- Java+FlexPaper+swfTools仿百度文库文档在线预览系统设计与实现
笔者最近在给客户开发文档管理系统时,客户要求上传到管理系统的文档(包括ppt,word,excel,txt)只能预览不允许下载.笔者想到了百度文库和豆丁网,百度文库和豆丁网的在线预览都是利用flash ...
- 关于IOS显示图片的一些注意事项
1.-568h 的图片只能在def.png显示,其他的都不支持. 2.在加载图片到Images.xcassets里面的时候,如果图片下面出现Unassigned这个时候这个图片就不能用,得拿到Imag ...
- 【BZOJ-3696】化合物 树形DP + 母函数(什么鬼)
3696: 化合物 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 165 Solved: 85[Submit][Status][Discuss] D ...
- BZOJ 1064 假面舞会(NOI2008) DFS判环
此题,回想Sunshinezff学长给我们出的模拟题,原题啊有木有!!此处吐槽Sunshinezff爷出题不人道!! 不过也感谢Sunshinezff学长的帮助,我才能做出来.. 1064: [Noi ...
- eclipse中xml文件不能自动提示的解决办法
1.出现不能提示的情况