JSP自定义标签

来源:互联网 发布:教育调查数据报告 编辑:程序博客网 时间:2024/06/05 22:39

JSP自定义标签的用途:

移除JSPjava代码(JSP规范不允许在jsp中出现java代码)

JSP自定义标签处理器的API


传统JSP自定义标签的解析过程:

web容器在解析jsp时发现页面中有jsp标签,查找tld文件后会去创建对应的标签处理类对象,标签处理类实例化之后相继调用setPageContext( )方法---------->setParent(Tag parent)---------->doStartTag( )--------->执行标签体---------->doAfterBody( )---------->doEndTag( )---------->web应用退出时调用release( )

JSP自定义标签的创建过程:

1、创建一个对应的标签处理类

程序员自定义的jsp标签处理类必须直接或间接地实现JspTag接口。JSP提供了很多JspTag的子接口,例如:TagIterationTag、BodyTagJSP同时提供了一些已经实现JspTag子接口的类,比如:TagSupport、BodyTagSupport。为了简化开发,标签处理类一般继承TagSupport、BodyTagSupport。

TagSupport中的常用方法:

doStartTag( ) :标签开始时执行何种操作

doAfterBody():标签体执行之后,doEndTag( )执行之前调用该方法

doEndTag( ) :标签结束时执行何种操作

release( ) web容器执行完自定义标签后,标签处理器会驻留在内存中,为其他请求服务,直至web应用停止时,web容器才会调用release( ) 方法,释放标签处理器占据的资源。

setParent(Tag parent) :设置父标签

getParent( ) : 获取父标签

setPageContext(ageContext pageContext):设置pageContext对象

其中:setPageContext( )是核心方法,该方法在web容器创建标签处理类对象后自动调用,设置了pageContext对象后,标签处理类对象就能获取其他的jsp对象,进而获取当前web的一切资源。

getPageContex( ) : 获取pageContext对象

BodyTagSupport继承了TagSupport,提供了修改标签体的方法:

setBodyContent(BodyContent bodyContent):设置标签体

doStartTag( ) 的常用返回值:

Tag.SKIP_BODY      表示不用处理标签体,直接调用doEndTag()方法。 

Tag.EVAL_BODY_INCLUDE  表示在现有的输出流对象中处理标签体,但绕过setBodyContent()doInitBody()方法 

BodyTag.EVAL_BODY_BUFFERED 表示需要处理标签体,且需要重新创建一个缓冲(调用setBodyContent方法)  

doAfterBody()的常用返回值:

IterationTag.EVAL_BODY_AGAIN     对标签体循环处理。(存在于javax.servlet.jsp.tagext.IterationTag接口中) 

doEndTag( )的常用返回值:

Tag.SKIP_PAGE      忽略标签后面的jsp(SUN企业级应用的首选)内容。 

Tag.EVAL_PAGE      处理标签后,继续处理jsp(SUN企业级应用的首选)后面的内容。


SimpleTag接口的提出是为了集中TagIterationTag、BodyTag的功能

JSP自定义标签的标签处理器如果是实现SimpleTag接口的标签处理器,则web解析JSP

自定义标签的过程是:

标签处理器实例化之后相继调用-------->setJspContext(JspContext  context)-------->setParent(JspTag parent)-------->setJspBody(JspFragment body)-------->doTag()-------->标签解析结束

SimpleTagSupportSimpleTag接口的一个实现类,SimpleTagSupport的常用方法:

setJspContext(JspContext  context) : 设置JspContext对象(JspContext本质就是pageContext

getJspContext( ) : 获取JspContext对象,继而获取Web应用的一切资源

setParent(JspTag parent) : 设置父标签

getParent( ) : 获取父标签

setJspBody(JspFragment body) :获取JspFragment对象(JspFragment封装了标签体)

getJspBody( ) :获取JspFragment对象

doTag( ) : 指定标签处理过程,默认什么都不做


补充:开发带属性的自定义标签,只需在标签处理器内部追加属性即可


2、创建tld文件

<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"

      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

      xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"

      version="2.0">

    

     <tlib-version>1.0</tlib-version>

     <short-name>MyTagLib</short-name>

     <uri>http://www.tangxiong.cn.mytaglib</uri>

    

     <tag>

         <name>hello</name>

        <tag-class>com.tangxiong.web.HelloTagHandler</tag-class>

        <body-content>empty</body-content>

     </tag>

 </taglib>


tld文件说明:

<taglib>

    <tlib-version>此标签库的版本

    <jsp-version>此标签库依赖的jsp版本

    <short-name>此标签库的名字,无实际意义

    <uri>指定该tld文件的网络地址

    <validator>该标签库的验证信息

    <listener>监听器

    <tag>某个标签

        <name>标签名

        <tag-class>标签处理类

       <body-content>标签体,其值可为empty/JSP/scriptless/tagdependent

       <attribute>某个属性

             <name>属性名

             <required>该属性是否必须,true/false

             <rtexprvalue>该属性是否可以接收一个运行时表达式的值(例如:EL表达式)

<taglib>

JSP页面使用jsp标签的指令:

<%@ taglib uri="http://www.tangxiong.cn.mytaglib" prefix="my"%>


原创粉丝点击