1.控制jsp页面某一部分内容是否执行
原理:控制doStartTag方法的返回值,如果返回值是Tag.EVAL_BODY_INCLUDE,则标签体执行;如果返回的是Tag.SKIP_BODY,那么标签体不会执行。
注意一点:在tld文件的tag标签的body-content选项的取值是:
EMPTY、 JSP、 scriptless 、 tagdepentend
2.用标签控制整个页面是否执行
(1)在页面的最上面加一个标签(不要有标签体,比如<itcast:demo2 />)
(2)在标签处理器类里面控制doEndTag方法的返回值,如果返回EVLAL_PAGE,则标签余下的jsp会执行,如果返回SKIP_PAGE,则余下jsp不会执行
3.控制jsp页面重复执行
编写一个java类,实现IterationTag接口,首先控制doStartTag方法的返回值,让它返回EVAL_BODY_INCLUDE,让标签体执行,然后控制doAfterBody方法,如果该方法返回EVAL_BODY_AGAIN,则标签就会重复执行,如果返回SKIP_BODY,则标签体不会再执行。
比如:我想要标签里面的内容重复输出5遍
<itcast:demo3>aaa</itcast:demo3>
这时如果用tag接口,是实现不了重复输出的,因为tag接口只能控制是否输出,不能控制重复输出。
public class TagDemo3 extends TagSupport {
int count = 0;
@Override
public int doStartTag() throws JspException {
// TODO Auto-generated method stub
return Tag.EVAL_BODY_INCLUDE;
}
@Override
public int doAfterBody() throws JspException {
count++;
if(count<5){
return IterationTag.EVAL_BODY_AGAIN;
}else{
return Tag.SKIP_BODY;
}
}
}
4.用自定义标签如何修改标签体
编写一个java类,实现BodyTag接口,首先控制doStartTag方法的返回值,让它返回EVAL_BODY_BUFFERED,则服务器会创建一个BODYCOntent对象封装标签体,并调用setBodyContent方法,把代表标签体的BODYCOntent对象传递给标签处理器类,开发人员在doendtag方法中,拿到BODYCOntent对象就拿到标签体,从而可以对标签体作出修改后再输出。
public class TagDemo4 extends BodyTagSupport {
@Override
public int doStartTag() throws JspException {
// TODO Auto-generated method stub
return BodyTag.EVAL_BODY_BUFFERED;
}
@Override
public int doEndTag() throws JspException {
BodyContent bc = this.bodyContent;
String content = bc.getString(); //得到标签体
content = content.toUpperCase();
try {
this.pageContext.getOut().write(content);
} catch (IOException e) {
throw new RuntimeException(e);
}
return Tag.EVAL_PAGE;
}
}