今天继续学习,张老师对每部分的研究都很透彻,让人学了,对知识知其然也知其所以然。已经对自定义标签有了基本的了解,张老师提到,自定义标签实质上就是把JSP页面中的java代码封装到一个java类中,从而将java代码分离出去,这与jsp中的javabean非常相似,这就出现了实际应用中对两者的选择问题。
张老师指出他们是毫无关系的,首先,jsp引擎在调用标签处理器时,会把jsp页面中的pageContext隐式对象传递给标签处理器,这样,标签处理器通过pageContext对象又可以jsp页面中的其他隐式对象,request,response,session等,因此,标签处理器能够完成jsp页面中所能完成的所有功能。例如,它能够直接向浏览器输出内容,在java类中获得JSP页面的环境信息并输出内容给浏览器,采用自定义标签就是最好的选择。然后,javabean也可以用于封装JSP页面中的java代码,但它仅仅是被作为一个普通的java类被JSP页面去调用,这并不是javabean的本来用途,javabean更多被用来表示系统中的一个实体对象,并提供给JSP页面访问和设置其属性的getter/setter方法。
自定义标签的功能及其基本原理
自定义标签除了可以包装JSP页面中的java代码之外,它还可以完成如下功能:
是否执行标签体中的内容。
是否重复执行标签体的内容
是否修改标签题的执行结果后再进行输出
是否忽略jsp页面中位于标签后面的内容
JSP引擎在对标签进行解析处理的过程中,每处理到一个阶段,JSP引擎都会调用标签处理器中的一个相应的方法,然后根据该方法的返回值来决定下一步的行为,其基本原理为:
1.web容器执行到自定义标签的开始标记时,就会去调用标签处理器中的doStartTag方法。doStartTag方法专门用于处理"遇到开始标记"这个事件,它可以返回各种不同的值来控制后续的行为:
(1)是否执行标签体中的内容。
(2)是直接输出标签体的执行结果,还是将标签体的执行结果输出到一个缓冲区对象中,从而可以让后续的事件方法对标签体的执行结果进行修改和控制其输出
2.Web容器执行完开始标记后就会去自定义标签的标签体,标签体执行完后,Web容器就会去调用标签处理器的doAfterBody方法。doAfterBody方法专门用于处理“标签体执行完”这个事件,这个方法可以返回不同的值来控制是否再次执行标签体。
3.Web容器执行完自定义标签的标签体后,就会接着去执行自定义标签的结束标记,同时,Web容器会调用标签处理器的doEndTag方法。doEndTag方法专门用于处理“遇到结束标记”这个事件,这个方法可以返回不同的值来控制Web容器是否执行jsp页面中剩余的内容。
自定义标签的api中有5个接口,简要说明一下;
JspTag接口,是所有自定义标签的父接口,它没有任何属性和方法,有两个子接口Tag和SimpleTag
Tag接口,是所有传统标签的父接口,其中定义了两个重要方法(doStartTag和doEndTag)还有四个常量:
doStartTag方法执行完后可以向Web容器返回常量EVAL_BODY_INCLUDE,Web容器就会接着执行自定义标签的标签体;也可以返回SKIP_BODY, Web容器就会忽略自定义标签的标签体,直接解释执行自定义标签的结束标记。
doEndTag方法执行完后可以向Web容器返回常量EVAL_PAGE,Web容器就会接着执行jsp页面中位于结束标记后面的JSP代码;也可以返回常量SKIP_PAGE,web容器就会忽略JSP页面位于结束标记后面的所有内容。
IterationTag接口,继承了Tag接口,并增加了doAfterBody方法和一个
EVAL_BODY_AGAIN常量。他能够通知web容器是否重复执行标签题内容。
BodyTag接口,继承了IterationTag接口,可以对标签体内容进行修改。
SimpleTag接口,只定义了一个doTag方法,可以完成所有逻辑。