关于EVAL_BODY_INCLUDE、SKIP_BODY、EVAL_BODY_AGAIN、EVAL_PAGE、SKIP_PAGE的区别探讨
来源:互联网 发布:移动4g 网络 编辑:程序博客网 时间:2024/05/21 17:23
最近在建立自定义标签并使用时,对于返回的值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;@Overridepublic int doAfterBody() throws JspException {System.out.println("=========doAfterBody=========");return SKIP_BODY;//EVAL_BODY_AGAIN;}@Overridepublic 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;}@Overridepublic 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.
- 关于EVAL_BODY_INCLUDE、SKIP_BODY、EVAL_BODY_AGAIN、EVAL_PAGE、SKIP_PAGE的区别探讨
- SKIP_BODY,SKIP_PAGE,EVAL_BODY_INCLUDE,EVAL_BODY_AGAIN
- TagSupport.SKIP_BODY,SKIP_PAGE,EVAL_BODY_INCLUDE,EVAL_BODY_AGAIN
- tag标签 SKIP_BODY,EVAL_PAGE,EVAL_BODY_INCLUDE,EVAL_BODY_AGAIN返回值的各个含义及区别
- SP自定义标签中,doStartTag()方法的返回值,EVAL_BODY_INCLUDE与SKIP_BODY的区别
- BodyTagSupport,包括SKIP_PAGE, EVAL_PAGE等
- 深入理解BodyTagSupport,包括SKIP_PAGE, EVAL_PAGE
- 深入理解BodyTagSupport,包括SKIP_PAGE, EVAL_PAGE
- 深入理解BodyTagSupport,包括SKIP_PAGE, EVAL_PAGE等
- 深入理解BodyTagSupport,包括SKIP_PAGE, EVAL_PAGE
- 深入理解BodyTagSupport,包括SKIP_PAGE, EVAL_PAGE
- 深入理解BodyTagSupport和TagSupport 包括SKIP_PAGE, EVAL_PAGE等
- 关于堆和栈的区别与探讨
- 关于session的探讨
- 关于敏捷的探讨
- 关于敏捷的探讨
- 关于工作流的探讨
- 关于RAII的探讨
- 解决/WEB-INF目录下的jsp页面引入webRoot下的Js、css和图片的问题
- Java语言编码规范(2)
- Android Mvp快速搭建框架MVP+Dagger2+Retrofit+Rxjava
- 线性表、栈、队列等查找、删除、插入的时间复杂度O()
- 《Pro .Net 4 Parallel Programming in C#》笔记
- 关于EVAL_BODY_INCLUDE、SKIP_BODY、EVAL_BODY_AGAIN、EVAL_PAGE、SKIP_PAGE的区别探讨
- Java语言编码规范 -01
- 【C#】datagridview分段保存为几个CSV文件
- 将博客搬至CSDN
- 关于App跳转到系统设置的界面
- Java Mail发送邮件(带多个附件)
- 2006-09-24
- Java 双检锁问题
- Sun HotSpot 1.4.1 JVM学习总结