4.简单标签——SimpleTag接口

来源:互联网 发布:今年网络流行语 编辑:程序博客网 时间:2024/05/21 07:49

由于传统标签使用三个标签接口(Tag、IterationTag、BodyTag)来完成不同的功能,显得过于繁琐,不利于标签技术的推广,SUN公司为降低标签技术的学习难度,在JSP 2.0中定义了一个更为简单、便于编写和调用的SimpleTag接口来实现标签的功能。实现SimpleTag接口的标签通常称为简单标签。

SimpleTag接口有5个方法:

(1)setJspContext方法
用于把JSP页面的pageContext对象传递给标签处理器对象
(2)setParent方法
用于把父标签处理器对象传递给当前标签处理器对象
(3)getParent方法
用于获得当前标签的父标签处理器对象
(4)setJspBody方法
用于把代表标签体的JspFragment对象传递给标签处理器对象
(5)doTag方法
用于完成所有的标签逻辑,包括输出、迭代、修改标签体内容等。在doTag方法中可以抛出javax.servlet.jsp.SkipPageException异常,用于通知WEB容器不再执行JSP页面中位于结束标记后面的内容,这等效于在传统标签的doEndTag方法中返回Tag.SKIP_PAGE常量的情况。 


有一个默认实现类:SimpleTagSupport,在简单标签里面,无论做什么,都是在doTag方法里面做的


1.控制标签体是否执行

(1)默认是不执行的(不会输出标签体)

public class Demo extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {

}
}


(2)控制标签体输出

public class SimpleTagDemo1 extends SimpleTagSupport {

@Override
public void doTag() throws JspException, IOException {

JspFragment jf = this.getJspBody();  //得到标签体

//jf.invoke(this.getJspContext().getOut());//标签体执行
//jf.invoke(null);//标签体执行

//上面两行代码任意一行都可以控制标签体的执行

}
}




2.用简单标签控制标签体重复执行

//重复执行标签体
public class SimpleTagDemo2 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {

JspFragment jf = this.getJspBody();

for(int i=0;i<5;i++){
jf.invoke(null);
}
}
}


3.用简单标签修改标签体

public class SimpleTagDemo3 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {

JspFragment jf = this.getJspBody();
StringWriter sw = new StringWriter();
jf.invoke(sw);

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

this.getJspContext().getOut().write(content);
}
}


4.用简单标签控制jsp页面是否执行

public class SimpleTagDemo4 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
throw new SkipPageException();
}

}


5.JspFragment类

javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段,这段JSP片段中不能包含JSP脚本元素。
WEB容器在处理简单标签的标签体时,会把标签体内容用一个JspFragment对象表示,并调用标签处理器对象的setJspBody方法把JspFragment对象传递给标签处理器对象。JspFragment类中只定义了两个方法,如下所示:
(1)getJspContext方法
用于返回代表调用页面的JspContext对象.

(2)public abstract void invoke(java.io.Writer out)
用于执行JspFragment对象所代表的JSP代码片段
参数out用于指定将JspFragment对象的执行结果写入到哪个输出流对象中,如果传递给参数out的值为null,则将执行结果写入到JspContext.getOut()方法返回的输出流对象中。(简而言之,可以理解为写给浏览器)

6.JspFragment类中invoke方法详解

JspFragment.invoke方法是JspFragment最重要的方法,利用这个方法可以控制是否执行和输出标签体的内容、是否迭代执行标签体的内容或对标签体的执行结果进行修改后再输出。例如:
(1)在标签处理器中如果没有调用JspFragment.invoke方法,其结果就相当于忽略标签体内容;
(2)在标签处理器中重复调用JspFragment.invoke方法,则标签体内容将会被重复执行;
(3)若想在标签处理器中修改标签体内容,只需在调用invoke方法时指定一个可取出结果数据的输出流对象(例如StringWriter),让标签体的执行结果输出到该输出流对象中,然后从该输出流对象中取出数据进行修改后再输出到目标设备,即可达到修改标签体的目的。

原创粉丝点击