¨JspFragment.invoke方法是JspFragment最重要的方法,利用这个方法可以控制是否执行和输出标签体的内容、是否迭代执行标签体的内容或对标签体的执行结果进行修改后再输出。例如:
o在标签处理器中如果没有调用JspFragment.invoke方法,其结果就相当于忽略标签体内容;
o在标签处理器中重复调用JspFragment.invoke方法,则标签体内容将会被重复执行;
o若想在标签处理器中修改标签体内容,只需在调用invoke方法时指定一个可取出结果数据的输出流对象(例如StringWriter),让标签体的执行结果输出到该输出流对象中,然后从该输出流对象中取出数据进行修改后再输出到目标设备,即可达到修改标签体的目的。
六、案例分析
方法分析:
public class DemoTag1 implements SimpleTag {
private PageContext pageContext;
private String name;
/**
* 用于完成所有的标签逻辑,包括输出、迭代、修改标签体内容。在doTag方法中可以抛出javax.servelt.jsp.
* SkipPageException异常
* ,用于通知web容器不再执行JSP页面中位于结束标记后面的内容,者等效于在传统标签的doEndTag方法中返回Tag.SKIP_PAGE常量的情况
* *
*/
@Override
public void doTag() throws JspException, IOException {
System.out.println("doTag");
}
/**
* 用于获得当前标签的父标签的处理器对象
*/
@Override
public JspTag getParent() {
System.out.println("getParent");
return null;
}
/**
* 用于吧代表标签体的JspFragment对象传递给标签处理器对象
*/
@Override
public void setJspBody(JspFragment jspBody) {
System.out.println("setJspBody");
}
/**
* 用于把JSP页面的pageContext对象传递给标签处理器对象
*/
@Override
public void setJspContext(JspContext pc) {
this.pageContext = (PageContext) pc;
System.out.println("setJspContext");
}
/**
* 用于把父标签处理器对象传递给当前标签处理器对象
*/
@Override
public void setParent(JspTag parent) {
System.out.println("setParent");
}
/**
* 属性是通过这个setter方法设置进来
*/
public void setName(String name) {
System.out.println("设置name属性"+name);
this.name = name;
}
}
1.//控制标签体是否执行
public class TagDemo1 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
JspFragment jf = this.getJspBody();
}
}
页面:
控制标签体是否执行xxxx
2.//控制标签体是否执行
public class TagDemo2 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
JspFragment jf = this.getJspBody();
for(int i=0;i<10;i++){
jf.invoke(null);
}
}
}
页面:
控制标签体重复执行xxxx
3.//修改标签体
public class TagDemo3 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);
}
}
页面:
修改标签体xxxx
4.//控制整个jsp是否执行
public class TagDemo4 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
throw new SkipPageException();
}
}
页面:
修改标签体5.//
public class TagDemo5 extends SimpleTagSupport {
private int count;
private Date date;
public void setCount(int count) {
this.count = count;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public void doTag() throws JspException, IOException {
System.out.println(date);
for(int i=0;i
this.getJspBody().invoke(null);
}
}
}
页面:
My JSP '5.jsp' starting pageaaaaaaa
6.配置文件:
demo1
web_16.simpletag.TagDemo1
scriptless
demo2
web_16.simpletag.TagDemo2
scriptless
demo3
web_16.simpletag.TagDemo3
scriptless
demo4
web_16.simpletag.TagDemo4
scriptless
demo5
web_16.simpletag.TagDemo5
scriptless
count
true
true
date
true
true