JSP----自定义标签---简单标签

本文介绍了JSP中的简单标签及SimpleTag接口的基本概念、方法执行顺序和应用场景,包括JspFragment类的作用、invoke方法的使用技巧以及如何开发带有属性的标签。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

一、简单标签的介绍

由于传统标签使用三个标签接口来完成不同的功能,不利于使用和推广,所以SUN公司又定义了实现简单标签的SimpleTag接口。

 

该接口共定义了5个方法:

setJspContext()      用于把JSP页面的pageContext对象传递给标签处理器对象

setParent()      用于把父标签处理器对象传递给当前标签处理器对象

getParent()     用于获得当前标签的父标签处理器对象

setJspBody()   用于把代表标签体的JspFragment对象传递给标签处理器对象

doTag()   用于完成所有的标签逻辑,包括输出、迭代、修改标签体内容等。

注意:在简单标签的使用中,用doTage()方法就可以完成对标签的所有操作,在该方法中可以抛出javax.servlet.jsp.SkipPageException异常,用于通知Web容器不在执行标签后面的内容。

 

二、SimpleTag接口方法的执行顺序

       1、当web容器开始执行标签时,会调用如下方法完成标签的初始化

       Web容器调用标签处理器对象的setJspContext方法,将代表JSP页面的pageContext对象传递给标签处理器对象。

       Web容器调用标签处理器对象的setParent方法,将父标签处理器对象传递给这个标签处理器对象。注意,只有在标签存在的情况下,web容器才会调用这个方法。

       如果调用标签时设置了属性,容器将调用每个属性对应的setter方法吧属性值传递给标签处理器对象。如果标签的属性值是EL表达式或脚本表达式,则web容器首先计算表达式的值,然后把值传递给标签处理器对象。

       如果简单标签有标签体,容器将调用setJspBody方法把代表标签体的JspFragment对象传递进来。

       2、执行标签时

       容器调用标签处理器的doTage方法,开发人员在方法体内通过操作JspFragment对象,就可以实现是否执行、迭代、修改标签体的目的。

 

三、JspFragment类

       Javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段,这段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()方法返回的输出流对象中(客户端、浏览器)。

 

四、inovke方法的使用

       由于该方法能把获取的标签体输出到客户端浏览器,所以该方法非常重要,控制了这个方法的调用,也就控制了客户端的输出。在使用这些方法时应该注意,如果为空标签,获取的标签体为null,这时应该注意空指针异常。

 

如果想忽略标签体内容,只要在标签处理器中不调用invoke方法就能实现。

 

如果想重复输出标签体,只要在标签处理器中重复调用invoke方法就能实现。

 

如果想再标签处理器中修改标签体内容,只需在调用invoke方法时指定一个可以取出结果数据的输出流对象(如:StringWriter),让标签体的执行结果输出到该输出流对象中,然后从该输出流对象中取出数据进行修改后再输出到目标设备。

实例:

import java.io.IOException;

import java.io.StringWriter;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.JspWriter;

import javax.servlet.jsp.tagext.JspFragment;

import javax.servlet.jsp.tagext.SimpleTagSupport;

public class SimpleTagDemo9 extends SimpleTagSupport{

       @Override

       public void doTag() throws JspException, IOException {

              JspFragment jf = this.getJspBody();           

              StringWriter sw = new StringWriter();

              jf.invoke(sw);       

              String content = sw.toString().toUpperCase();           

              JspWriter jw = this.getJspContext().getOut();

              jw.write(content);

       }    

}

 

 

五、开发带属性的标签

       在应用的过程中我们经常需要传递参数(比如:标签体在界面输出的次数)来使程序更具有灵活性,这些参数就可以定义为标签的属性传递过去。

 

定义带有属性的标签步骤:

1、  在标签处理器中编写每个属性对应的setter()方法。

2、  在TLD文件中该标签的描述中添加<attribute>标签

实例:

<tag>

  <name>demo8</name>

  <tag-class>com.hbsi.web.tag.SimpleTagDemo8</tag-class>

  <body-content>scriptless</body-content>

  <attribute>

  <name>count</name>            //定义的属性名称

  <required>true</required>     //该属性是否是必须的

  <rtexprvalue>true</rtexprvalue>   //运行时是否计算该属性的值

  </attribute>

 </tag>

 

注意:在定义带有属性的标签时,Jsp中的属性名必须跟标签处理器中的属性名保持一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值