JSP1.x 自定义标签
Tag接口
任何一个标签都对应着一个java类,该类必须实现Tag接口,JSP遇到一个标签后后,将通过一个tld文件查找该标签的实现类,并运行该类的相关方法
import javax.servlet.jsp.JspException; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.Tag; public class TagTest implements Tag { private Tag parent; private PageContext pageContext; @Override public int doEndTag() throws JspException{ //标签结束时执行 JspWriter out =pageContext.getOut(); try{ out.println("……"); }catch(IOExceptione){ throw new JspException(e); } return EVAL_PAGE; } @Override public int doStartTag() throwsJspException { //标签开始时执行 return SKIP_BODY; } @Override public Tag getParent() { // TODO Auto-generated method stub return null; } @Override public void release() { // TODO Auto-generated method stub } @Override public void setPageContext(PageContextarg0) { // TODO Auto-generated method stub } @Override public void setParent(Tag arg0) { // TODO Auto-generated method stub } }doStartTag方法可以返回两种参数,如果为SKIP_BODY,表示标签体内的内容不被输出,如果为EVAL_BODY_INCLUDE,则执行标签体内的代码
doEndTag也可以返回两种参数,如果为SKIP_PAGE,表示不执行标签后面的内容。如果为EVAL_PAGE,则执行标签后面的内容
此类中有两个属性,parent和pageContext,parent为该标签的父标签(或者是上一层的标签),pageContext为运行该标签的JSP页面,这两个参数都是JSP在运行时通过setter方法注射进去的
Tag实现类有了,还需要tld文件(Tag Library Descriptor)
<?xml version="1.0" ecoding="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 web-jsptaglibrary_2_0.xsd version="2.0"> <tlibversion>1.0</tlibversion> <jspversion> 1.1</jspversion> <shortname>tagname</shortname> <uri>http://www.clf.com/tags</uri> <info>A simple tag test</info> <tag> <name>tagname</name> <tagclass>com.chen.tags.TagTest</tagclass> <bodycontent>JSP</ bodycontent> <info>tag information</info> </tag> </taglib>shortname也就是推荐使用的prefix,uri就是引用这个标签库时使用的uri
bodycontent为标签体的限制,有三种取值
empty:不允许有标签体的存在,如果有会抛出异常
JSP:允许有标签体存在,可以为JSP代码
tagdependent:允许有标签体存在,但是标签里的JSP代码不会被执行
如果tld文件位于/WEB-INF/下面,Tomcat会自动加载;如果位于其他位置,可以在web.xm中配置
<jsp-config> <taglib> <taglib-uri> http://www.clf.com/tags</taglib-uri> <taglib-location>/WEB-INF/taglib.tld</taglib-location> </taglib> </jsp-config>TagSupport
多数情况下不需要直接实现Tag接口,使用TagSupport类就可以了,此类是java提供的一个模板类,一般来说,只需要实现doStartTag方法和doEndTag方法就可以了
import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.TagSupport; public class Tagtest extends TagSupport { private int num1; private int num2; @Override public int doEndTag() throws JspException{ try { this.pageContext.getOut().println("两数相加等于:"+(num1+num2)); } catch (Exception e) { } return EVAL_PAGE; } @Override public int doStartTag() throwsJspException { return super.doStartTag(); } public int getNum1() { return num1; } public void setNum1(int num1) { this.num1 = num1; } public int getNum2() { return num2; } public void setNum2(int num2) { this.num2 = num2; } }配置文件
<tag> <name>add</name> <tagclass>com.chen.tags.TagTest</tagclass> <bodycontent>JSP</bodycontent> <info>tag information</info> <attribute> <name>num1</name> <required>true</required > <rtexprvalue>true</rtexprvalue > </attribute> <attribute> <name>num2</name> <required>true</required > <rtexprvalue>true</rtexprvalue > </attribute> </tag>name代表属性的名字,required代表是否是必需的,rtexprvalue代表此属性是否允许使用EL表达式
以上这个标签这样使用:
<taglib:add num1=”2” num2=”3”/>则页面会输出2和3 的相加之和
BodyTagSupport
BodyTagSupport是Tag接口的子类,专门处理带标签体的标签
public class ToLowerCaseTag extends BodyTagSupport{ public int doEndTag throws JspException{ //获取标签体内的代码 String contend = this.getBodyContent().getString(); try{ this.pageContent.getOut().println(content.toLowerCase()); }catch(Exception e){ } return EVAL_PAGE; } }只要在setBodyContent()方法之后被调用的方法中,都可以使用getBodyContent()方法获取标签体的内容,一般为doAfterBody()或者doEndTag()
BodyTagSupport的执行流程如下:
1.当容器创建一个新的标签实例后,通过setPageContext来设置标签的页面上下文.
2.使用setParent方法设置这个标签的上一级标签,如果没有上一级嵌套,设置为null.
3.设置标签的属性,这个属性在标签库描述文件中定义,如果没有定义属性,就不调用此类方法.
4.调用doStartTag方法,这个方法可以返回EVAL_BODY_INCLUDE和SKIP_BODY,当返回EVAL_BODY_INCLUDE时,就计算标签的body,如果返回SKIP_BODY,就不再计算标签的body,如果为EVAL_BODY_BUFFERED,则不会输出,而是将标签体内容通过setBodyContent()方法注射到标签类中,然后就可以使用getBodyContent()取得标签体的内容
5.调用setBodyContent设置当前的BodyContent.
6.调用doInitBody,如果计算BodyContent时需要进行一些初始化,就在这个方法中进行.
7.每次计算完Body后调用doAfterBody,如果返回EVAL_BODY_AGAIN,表示继续计算一次Body,直到返回SKIP_BODY才继续往下执行.
8.调用doEndTag方法,这个方法可以返回EVAL_PAGE或者SKIP_PAGE,当返回EVAL_PAGE时,容器将在标签结束时继续计算JSP页面其他的部分;如果返回SKIP_PAGE,容器将在标签结束时停止计算JSP页面其他的部分.
9.调用release()方法释放标签程序占用的任何资源。
public class LoopTag extends BodyTagSupport{ private int times; public int doStartTag() throwsJspException{ times = 5; return super.doStartTag(); } public int doAfterBody() throwsJspException{ if(times-- >0){ 只要times大于零继续循环,同时times自减 try{ this.getPreviousOut().println(this.getBodyContent().getString()); }catch(Exception e){ } return EVAL_BODY_AGAIN; //继续执行 }else{ return SKIP_BODY; } } }以上定义了一个循环标签
<taglib:loop>loop.</taglib:loop>
会得到如下输出:
loop.
loop. loop.
loop. loop. loop.
loop. loop. loop.loop.
loop. loop. loop.loop. loop.
实际上,doAfterBody方法内的输出是写到bodyContent缓存中的
BodyTagSupport中,里面的标签可以通过getparent()方法获得上层的标签
JSP1.x 自定义标签的更多相关文章
- javaWeb 在jsp中 使用自定义标签输出访问者IP
1.java类,使用简单标签,jsp2.0规范, 继承 SimpleTagSupport public class ViewIpSimpleTag extends SimpleTagSupport { ...
- JSP进阶 之 SimpleTagSupport 开发自定义标签
绝大部分 Java 领域的 MVC 框架,例如 Struts.Spring MVC.JSF 等,主要由两部分组成:控制器组件和视图组件.其中视图组件主要由大量功能丰富的标签库充当.对于大部分开发者而言 ...
- 【转】JSP自定义标签
转载自:http://www.cnblogs.com/edwardlauxh/archive/2010/05/20/1918587.html tld标签的描述文件 标签的描述文件是一个描述整个标签库标 ...
- 自定义标签(客户化jsp标签)
客户化jsp标签技术是在jsp1.1版本中才出现的,他支持用户在jsp文件中自定义标签,这样可以使jsp代码更加简单,这些可重用的标签能够处理复杂的逻辑运算和事物或定义jsp网页的输出内容和格式. 创 ...
- Java Web开发技术教程入门-自定义标签
回顾: 昨天了解了JSP开发的两种模式Model1和Model2模式.Model1采用JSP+JavaBean技术开发Web应用,它比较适合小规模应用的开发,效率较高,易于实现.但由于在Model1中 ...
- [JSP]自定义标签库taglib
自定义标签的步骤 自定义标签的步骤大概有三步: 1.继承javax.servlet.jsp.tagext.*下提供的几个标签类,如Tag.TagSupport.BodyTagSupport.Simpl ...
- [Java] JSP笔记 - 自定义标签
自定义标签的创建步骤: 自定义标签的四大功能: 自定义标签的类结构: 在 1.0 中呢, 可以将 <body-content> 的值设置为 JSP, 2.0中则不允许在自定义标签体中出现j ...
- thinkphp自定义标签库
thinkphp ~ php中 的类, 的成员变量, 本身是没有类型说明的, 那么我怎么知道它的类型呢? 或初始值呢? 通常在类定义中, 如果能给一个初始值的(对于已知简单类型的),最好给一个初始值, ...
- 12 自定义标签/JSTL标签库/web国际化/java web之设计模式和案例
EL应用 自定义一个标签,实现两个字符串的相加 1回顾 1.1servlet生命周期 init(ServletConfig) service ...
随机推荐
- [HAOI 2011]Problem b
Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数 ...
- [Luogu 3690]【模板】Link Cut Tree (动态树)
Description 给定N个点以及每个点的权值,要你处理接下来的M个操作.操作有4种.操作从0到3编号.点从1到N编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和. ...
- [JSOI2007]麻将
Description 麻将是中国传统的娱乐工具之一.麻将牌的牌可以分为字牌(共有东.南.西.北.中.发.白七种)和序数 牌(分为条子.饼子.万子三种花色,每种花色各有一到九的九种牌),每种牌各四张. ...
- 2015 多校联赛 ——HDU5302(矩阵快速幂)
The Goddess Of The Moon Sample Input 2 10 50 12 1213 1212 1313231 12312413 12312 4123 1231 3 131 5 5 ...
- VK-Cup 2017 qualification 1
VK-Cup,cf里面只有切成俄文才能看到,题目也都是俄文的(百度翻译成英文和中文). 两人组队参赛的,赛期1天,乐多赛赛制(和时间基本无关,交上去挂了扣分).这次是第一场资格赛. 这次又和ditol ...
- 【网络流问题·我就想建好模】
·为了有助于你读后文,在写题前先列出一些大米饼的代码习惯: 一个提醒:所有的ADD函数无特殊说明均如图:(没有w就直接跳过) 以及: go(i,a,b)=====for(int i=a;i<=b ...
- python中的缩进问题
python中没有{}来表示代码块,而是用缩进来表示,刚开始写python代码,没有注意缩进,结果各种报错(( ╯□╰ )). 在python中的原则就是同一层次的代码一定要有相同的缩进!!! 从上图 ...
- linux下磁盘分区详解 图文(fdisk;mkfs)
linux分区不同于windows,linux下硬盘设备名为(IDE硬盘为hdx(x为从a-d)因为IDE硬盘最多四个,SCSI,SATA,USB硬盘为sdx(x为a-z)),硬盘主分区最多为4个,不 ...
- 对于DFT频谱泄漏问题的研究
问题简介: 对于频率为fs的正弦序列,它的频谱应该只是在fs处有离散谱.但是,在实际利用DFT求它的频谱时,对时域做了截断,结果使信号的频谱不只是在fs处有离散谱,而是在以fs为中心的频带范围内都有谱 ...
- 虚拟机搭建Zookeeper服务器集群完整笔记
虚拟机搭建Zookeeper服务器集群完整笔记 本笔记主要记录自己搭建Zookeeper服务器的全过程,默认已经安装部署好Centos7. 一.虚拟机下Centos无法联网解决方案 1.首先调整虚拟机 ...