您的位置:首页 > 大数据 > 人工智能

关于EVAL_BODY_INCLUDE、SKIP_BODY、EVAL_BODY_AGAIN、EVAL_PAGE、SKIP_PAGE的区别探讨

2017-04-06 15:55 239 查看
最近在建立自定义标签并使用时,对于返回的值EVAL_BODY_INCLUDE、SKIP_BODY、EVAL_BODY_AGAIN、EVAL_PAGE、SKIP_PAGE分不太清楚,看网上的相关博客虽然讲得较为清晰,但是为了更加彻底地清楚他们的区别,动手写了一个实例,终于弄明白它们的区别,也是伤不起咯!

 

首先,建一个自定义标签的.tld文件,

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">

<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>role</shortname>
<uri>http://www.hhhh.com</uri>
<info>Test Tags Library</info>

<tag>
<name>display</name>
<tagclass>com.xxx.tag.TestTag</tagclass>
<bodycontent>jsp</bodycontent>
<info>just a test</info>
<attribute>
<name>type</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>

 

 

这个tld文件里面定义了一个名为display的tag,这个tag包含了一个名为type的属性。

 

在测试页面引用这个自定义标签。

<%@ taglib uri="/WEB-INF/tld/kkfun-test.tld" prefix="test"%>

<test:display type="lala">热血高校</test:display>超级

 

   所以,接下来开始定义相应的标签处理类:

public class TestTag extends BodyTagSupport {

private String type;

@Override
public int doAfterBody() throws JspException {
System.out.println("=========doAfterBody=========");
return SKIP_BODY;//EVAL_BODY_AGAIN;
}

@Override
public int doEndTag() throws JspException {
System.out.println("========doEndTag=========");
JspWriter out = this.pageContext.getOut();
try {
out.println("Hello !!!!");
} catch (IOException e) {
e.printStackTrace();
}
return EVAL_PAGE;//SKIP_PAGE;
}

@Override
public int doStartTag() throws JspException {
System.out.println("======doStartTag========");
System.out.println("then you must call " + type.toUpperCase() + " first");
return SKIP_BODY;//EVAL_BODY_INCLUDE;
}

public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}

 需要注意的是,BodyTagSupport extends TagSupport,而我们一般来说用得较多的还是BodyTagSupport 。

 

整理如下:

1)标签处理类中extends BodyTagSupport ,一般来讲实现的三个方法是doStartTag,doAfterBody,doEndTag。

 

2)根据打印结果顺序:

======doStartTag========
then you must call LALA first
========doAfterBody=========
========doEndTag=========

 可以看出标签处理类执行方法的一般顺序为:doStartTag()->doAfterBody()->doEndTag()

 

 

3)doStartTag()方法的合理返回值为EVAL_BODY_INCLUDE和SKIP_BODY

----------返回值为EVAL_BODY_INCLUDE时,表明执行标签体中间的内容,页面上的结果为:热血高校Hello !!!! 超级 

----------返回值为SKIP_BODY时,表明不执行标签体中间的内容,页面上的结果为:Hello !!!! 超级 

 

4)doAfterBody()方法的合理返回值为SKIP_BODY和EVAL_BODY_AGAIN

---------返回值为SKIP_BODY时,表示继续处理标签执行的下一步,页面上的结果为:热血高校Hello !!!! 超级 

---------返回值为为EVAL_BODY_AGAIN时,表示会重复执行标签体中间的内容,页面上的结果为:热血高校热血高校热血高校Hello !!!! 超级 

 

5)doEndTag()的合理返回值为EVAL_PAGE和SKIP_PAGE

 

---------返回值为EVAL_PAGE时,表示标签结束后继续执行页面上的内容,页面上的结果为:热血高校Hello !!!! 超级 

---------返回值为为SKIP_PAGE时,表示不继续执行结束标签后的内容,页面上的结果为:热血高校Hello !!!!

 

 巧妙的实际应用:比如一个管理系统的权限问题,当登录用户的用户类型符合某一集合时,就显示在自定义标签中的内容,此时doStartTag()返回EVAL_BODY_INCLUDE,表明他有权限访问标签体当中的内容;反之,当他不在这个集合中时,doStartTag()返回SKIP_BODY,表明不显示标签体中的内容,也就是没有权限访问。

 

小结:一般而言,doStartTag()返回SKIP_BODY,doAfterBodyTag()返回SKIP_BODY,doEndTag()返回EVAL_PAGE.

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: