• JSP传统标签开发


    1、标签技术的API类继承关系

    1)、JspTag接口是所有自定义标签的父接口

    该接口中没有任何属性和方法,只有两个直接子接口,Tag接口和SimpleTag接口,把实现Tag接口的自定义标签叫做传统标签,把实现SimpleTag接口的自定义标签叫做简单标签

    2)、Tag接口,所有传统标签的父接口,两个重要方法(doStartTag、doEndTag)和四个常量(EVAL_BODY_INCLUDE、SKIP_BODY、EVAL_PAGE、SKIP_PAGE)

      WEB容器在解释执行JSP页面过程中,遇到自定义标签的开始标记就会去调用标签处理器的doStartTag方法,该方法可以返回常量SKIP_BODY和EVAL_BODY_INCLUDE。如果返回SKIP_BODY,WEB容器就会忽略自定义标签的标签体,直接执行自定义标签的结束标记;如果返回EVAL_BODY_INCLUDE,WEB容器就会执行自定义标签标签体。

      WEB容器在解释执行JSP页面过程中,遇到自定义标签的结束标记就会去调用标签处理器的doEndTag方法,该方法可以返回常量SKIP_PAGE和EVAL_PAGE。如果返回SKIP_PAGE,WEB容器就会忽略自定义标签结束标记后面所有内容;如果返回EVAL_PAGE,WEB容器就会接着执行自定义标签结束标记后面的代码

    package TagDemo;
    
    import javax.servlet.jsp.JspException;
    import javax.servlet.jsp.PageContext;
    import javax.servlet.jsp.tagext.Tag;
    
    /**
     * Created by JiaPeng on 2016/8/19.
     */
    public class TagDemo implements Tag {
        @Override
        public void setPageContext(PageContext pageContext) {
    
        }
    
        @Override
        public void setParent(Tag tag) {
    
        }
    
        @Override
        public Tag getParent() {
            return null;
        }
    
        @Override
        public int doStartTag() throws JspException {
            return Tag.EVAL_BODY_INCLUDE;//输出标签体
    //        return Tag.SKIP_BODY;//跳过标签体直接解释执行结束标识符
        }
    
        @Override
        public int doEndTag() throws JspException {
    //        return Tag.EVAL_PAGE;//执行完标签体后继续执行后面代码
            return Tag.SKIP_PAGE;//执行完标签体后,忽略后面所有内容
        }
    
        @Override
        public void release() {
    
        }
    }
    Tag接口实现类
    <?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">
        <description>自定义标签</description>
    
        <tlib-version>1.0</tlib-version>
    
        <short-name>SDT</short-name>
    
        <uri>/sefDefineTag</uri>
        <tag>
            <name>tagDemo</name>
            <tag-class>TagDemo.TagDemo</tag-class>
            <body-content>JSP</body-content>
        </tag>
    </taglib>
    tld文件代码
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@taglib prefix="sdt" uri="/sefDefineTag" %>
    <html>
    <head>
        <title></title>
    </head>
    <body>
    <h1>下面是自定义标签:</h1>
    <h6>---------------------------------------------</h6>
    <sdt:tagDemo>标签体</sdt:tagDemo>
    <h6>---------------------------------------------</h6>
    <div>
        <h1>自定义标签下面内容</h1>
    </div>
    </body>
    </html>
    JSP测试代码

    3)、IterationTag接口,继承自Tag接口,并新增一个方法doAfterBody和一个常量EVAL_BODY_AGAIN。因此实现了IterationTag接口的自定义标签除了可以完成Tag接口所有功能外,还能够通知WEB容器是否重复执行标签体内容。

      对于实现了IterationTag接口的自定义标签,WEB容器执行完自定义标签的标签体后,将调用标签处理器的doAfterBody方法,该方法可以返回SKIP_BODY和EVAL_BODY_AGAIN。如果返回EVAL_BODY_AGAIN,WEB容器就会把标签体的内容重复执行一次,执行完后再调用doAfterBody方法,如此往复,直到doAfterBody方法返回SKIP_BODY,然后WEB容器才会执行标签结束标记和调用doEndTag方法。

      TagSupport是IterationTag接口的默认实现类,我们在开发中可以继承和扩展TagSupport类,这相比实现IterationTag接口简化了工作。

    package TagDemo;
    
    import javax.servlet.jsp.JspException;
    import javax.servlet.jsp.tagext.IterationTag;
    import javax.servlet.jsp.tagext.Tag;
    import javax.servlet.jsp.tagext.TagSupport;
    
    /**
     * Created by JiaPeng on 2016/8/18.
     */
    public class IterationTagDemo extends TagSupport {
    
        int x = 5;
    
        @Override
        public int doStartTag() throws JspException {
            x=5;
            return Tag.EVAL_BODY_INCLUDE;//输出标签体内容
        }
    
        @Override
        public int doAfterBody() throws JspException {
            x--;
            if (x > 0) {
                return IterationTag.EVAL_BODY_AGAIN;//循环标签体
            } else {
                return IterationTag.SKIP_BODY;//结束循环
            }
        }
    
    //    @Override
    //    public int doEndTag() throws JspException {
    //        return Tag.EVAL_PAGE;
    //    }
    }
    TagSupport子类代码,doStartTag方法返回EVAL_BODY_INCLUDE
    <?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">
        <description>自定义标签</description>
    
        <tlib-version>1.0</tlib-version>
    
        <short-name>SDT</short-name>
    
        <uri>/sefDefineTag</uri>
        <tag>
            <name>tagDemo</name>
            <tag-class>TagDemo.TagDemo</tag-class>
            <body-content>JSP</body-content>
        </tag>
        <tag>
            <description>测试循环</description>
            <name>iteration</name>
            <tag-class>TagDemo.IterationTagDemo</tag-class>
            <body-content>JSP</body-content>
        </tag>
    </taglib>
    tld文件代码
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@taglib prefix="sdt" uri="/sefDefineTag" %>
    <html>
    <head>
        <title></title>
    </head>
    <body>
    <h1>下面是自定义标签:</h1>
    <h6>---------------------------------------------</h6>
    
    <sdt:tagDemo>标签体</sdt:tagDemo>
    <br/>
    <br/>
    <sdt:iteration>循环标签体5次<br/></sdt:iteration>
    <h6>---------------------------------------------</h6>
    <div>
        <h1>自定义标签下面内容</h1>
    </div>
    </body>
    </html>
    JSP测试代码

    4)、BodyTag接口,继承自IterationTag接口,并新增两个方法setBodyContent、doInitBody和一个常量EVAL_BODY_BUFFERED。因此实现了BodyTag接口的自定义标签除了可以完成IterationTag接口定义的功能外,还可以对标签体内容进行修改。

      对于实现了BodyTag接口的自定义标签,标签处理器的doStartTag方法不仅可以返回常量SKIP_BODY和EVAL_BODY_INCLUDE,还可以返回常量EVAL_BODY_BUFFERED,如果返回常量EVAL_BODY_BUFFERED,WEB容器就会创建一个捕获标签体运行结果的BodyContent对象,调用标签处理器的setBodyContent方法,将对象引用传递给标签处理器,然后WEB容器将标签体的处理结果写入BodyContent对象中,这样在后续事件方法中,就可以通过调用BodyContent对象中方法对标签体内容进行修改和控制输出。

      BodyTagSupport是BodyTag接口默认实现类,开发中可以集成或扩展BodyTagSupport类,这相比实现BodyTag接口简化了工作。

    package TagDemo;
    
    import javax.servlet.jsp.JspException;
    import javax.servlet.jsp.tagext.BodyContent;
    import javax.servlet.jsp.tagext.BodyTag;
    import javax.servlet.jsp.tagext.BodyTagSupport;
    import javax.servlet.jsp.tagext.Tag;
    import java.io.IOException;
    
    /**
     * Created by JiaPeng on 2016/8/18.
     */
    public class BodyTagDemo extends BodyTagSupport {
        @Override
        public int doStartTag() throws JspException {
            return BodyTag.EVAL_BODY_BUFFERED;
        }
    
        @Override
        public int doEndTag() throws JspException {
            BodyContent content = this.getBodyContent();
            String str = content.getString();
            String result = str.toUpperCase();
            try {
                this.pageContext.getOut().write(result);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return Tag.EVAL_PAGE;
        }
    
        @Override
        public void doInitBody() throws JspException {
            System.out.println("doInitBody");
            super.doInitBody();
        }
    }
    BodyTagSupport子类代码,doStartTag方法返回EVAL_BODY_BUFFERED
    <?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">
        <description>自定义标签</description>
    
        <tlib-version>1.0</tlib-version>
    
        <short-name>SDT</short-name>
    
        <uri>/sefDefineTag</uri>
        <tag>
            <name>tagDemo</name>
            <tag-class>TagDemo.TagDemo</tag-class>
            <body-content>JSP</body-content>
        </tag>
        <tag>
            <description>测试循环</description>
            <name>iteration</name>
            <tag-class>TagDemo.IterationTagDemo</tag-class>
            <body-content>JSP</body-content>
        </tag>
        <tag>
            <description>测试修改标签体内容</description>
            <name>bodytag</name>
            <tag-class>TagDemo.BodyTagDemo</tag-class>
            <body-content>JSP</body-content>
        </tag>
    </taglib>
    tld文件代码
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@taglib prefix="sdt" uri="/sefDefineTag" %>
    <html>
    <head>
        <title></title>
    </head>
    <body>
    <h1>下面是自定义标签:</h1>
    <h6>---------------------------------------------</h6>
    
    <sdt:tagDemo>标签体</sdt:tagDemo>
    <br/>
    <br/>
    <sdt:iteration>循环标签体5次<br/></sdt:iteration>
    <br/>
    <br/>
    <sdt:bodytag>abc</sdt:bodytag>
    <h6>---------------------------------------------</h6>
    <div>
        <h1>自定义标签下面内容</h1>
    </div>
    </body>
    </html>
    JSP测试代码,小写转大写

     5)、SimpleTag接口,直接继承自JspTag接口,由于传统标签接口实现功能繁琐,不利于技术推广,SUN公司为了降低技术学校难度,在JSP2.0中定义了更为简单的SimpleTag接口,接口中之定义了处理标签逻辑的doTag方法,该方法在WEB容器执行自定义标签时候被调用,且只被调用一次,可完成传统标签所定义的功能,如是否执行标签体、迭代标签体、对标签体内容进行修改等。

      SimpleTagSupport是SimpleTag接口默认实现类,开发中可以集成或扩展SimpleTagSupport类,相比SimpleTag接口实现简化了工作。

    自定义标签中常用方法及其返回值说明,如下图

  • 相关阅读:
    Tree Recovery解题报告
    bjtuOJ1019 Robot
    bjtuOJ1137 蚂蚁爬杆
    栈的使用,rails
    重做catch the cow
    C#3.0新特性之匿名类型
    C#Lambda表达式的用法
    C#进程的使用方法详解
    C#进程管理启动和停止
    C#LINQ查询表达式用法
  • 原文地址:https://www.cnblogs.com/hujiapeng/p/5785220.html
Copyright © 2020-2023  润新知