zoukankan      html  css  js  c++  java
  • JSP简单标签开发

    一、继承自SimpleTag接口的自定义标签实现类称为简单标签,接口中5个方法

    1、setJspContext方法

      用于把JSP页面的PageContext对象传递给标签处理器对象

    2、setParent方法

      把父标签处理器对象传递给当前处理器对象

    3、getParent方法

      用于获取当前标签的父标签处理器对象

    4、setJspBody方法

      用于把代表标签体的JspFragment对象传递给标签处理器对象

    5、doTag方法

      用于完成所有标签逻辑,如输出、迭代、修改标签内容等。在方法中可以通过抛出javax.servlet.jsp.SkipPageException异常,通知WEB容器不再执行当前标签结束标记后面代码,等效于doTagEnd方法的返回值常量Tag.SKIP__PAGE

    二、SimpleTag接口方法在WEB容器中执行顺序

    1、调用setJspContext方法,将代表JSP页面的pageContext对象传递给标签处理器对象

    2、如果当前标签有父级标签,调用setParent方法将父标签处理器对象传递给当前标签处理器对象

    3、如果当前标签有属性,则调用每个属性的setter方法,将属性值传递给标签处理器对象;如果属性是EL表达式或脚本表达式,则WEB容器优先计算表达式,然后把值传递给标签处理器对象

    4、简单标签有标签体,则调用setJspBody方法,把代表标签体的JspFragment对象传递给标签处理器

    5、WEB容器执行doTag方法,通过操作JspFragment对象,实现标签体是否执行、迭代、修改标签体内容等操作

    三、例子,开发中经常继承自SimpleTagSupport类

    1、控制标签体是否执行,不调用invoke方法则不执行标签体

    package TagDemo;
    
    import javax.servlet.jsp.JspException;
    import javax.servlet.jsp.PageContext;
    import javax.servlet.jsp.tagext.JspFragment;
    import javax.servlet.jsp.tagext.SimpleTagSupport;
    import java.io.IOException;
    
    public class SimpleTagDemo extends SimpleTagSupport {
        @Override
        public void doTag() throws JspException, IOException {
            JspFragment fragment = this.getJspBody();//获取标签体
    //        PageContext pageContext= (PageContext) fragment.getJspContext();
    //        fragment.invoke(pageContext.getOut());
            fragment.invoke(null);
        }
    }
    控制标签体是否执行
    <?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>
        <tag>
            <name>simpleTag</name>
            <tag-class>TagDemo.SimpleTagDemo</tag-class>
            <!--简单标签中,body-content中一般设置成empty或scriptless,如果设置成JSP会抛异常;
            传统标签中,body-content中一般设置成empty或JSP;
            如果body-content设置成tagdependent,那么标签体里的内容是给标签处理类使用的,
            例如:标签体里的SQL语句,就可以设置成tagdependent,标签处理器类得到SQL语句处理-->
            <body-content>scriptless</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>
    <br/>
    <br/>
    <sdt:simpleTag>简单标签体</sdt:simpleTag>
    <h6>---------------------------------------------</h6>
    <div>
        <h1>自定义标签下面内容</h1>
    </div>
    </body>
    </html>
    JSPDemo

    2、标签体循环执行,doTag中循环调用invoke方法

    package TagDemo;
    
    import javax.servlet.jsp.JspException;
    import javax.servlet.jsp.tagext.JspFragment;
    import javax.servlet.jsp.tagext.SimpleTagSupport;
    import java.io.IOException;
    
    public class SimpleIterationTagDemo extends SimpleTagSupport {
        @Override
        public void doTag() throws JspException, IOException {
            JspFragment fragment = this.getJspBody();
            for (int i = 0; i < 5; i++) {
                fragment.invoke(null);
            }
        }
    }
    标签体循环执行5次
    <?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>
        <tag>
            <name>simpleTag</name>
            <tag-class>TagDemo.SimpleTagDemo</tag-class>
            <!--简单标签中,body-content中一般设置成empty或scriptless,如果设置成JSP会抛异常;
            传统标签中,body-content中一般设置成empty或JSP;
            如果body-content设置成tagdependent,那么标签体里的内容是给标签处理类使用的,
            例如:标签体里的SQL语句,就可以设置成tagdependent,标签处理器类得到SQL语句处理-->
            <body-content>scriptless</body-content>
        </tag>
        <tag>
            <name>simpleIterationTag</name>
            <tag-class>TagDemo.SimpleIterationTagDemo</tag-class>
            <body-content>scriptless</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>
    <br/>
    <br/>
    <sdt:simpleTag>简单标签体</sdt:simpleTag>
    <br/>
    <br/>
    <sdt:simpleIterationTag>简单标签体循环5次<br/></sdt:simpleIterationTag>
    <h6>---------------------------------------------</h6>
    <div>
        <h1>自定义标签下面内容</h1>
    </div>
    </body>
    </html>
    JSPDemo

    3、修改标签体内容,通过doTag方法中invoke方法,将标签体写入StringWriter对象中

    package TagDemo;
    
    import javax.servlet.jsp.JspException;
    import javax.servlet.jsp.PageContext;
    import javax.servlet.jsp.tagext.JspFragment;
    import javax.servlet.jsp.tagext.JspTag;
    import javax.servlet.jsp.tagext.SimpleTagSupport;
    import java.io.IOException;
    import java.io.StringWriter;
    
    public class SimpleBodyTagDemo extends SimpleTagSupport {
        @Override
        public void doTag() throws JspException, IOException {
            JspFragment fragment=this.getJspBody();
            JspTag parentTag=this.getParent();
            StringWriter stringWriter=new StringWriter();
            //将标签体内容写到stringwriter流中
            fragment.invoke(stringWriter);
            //获取stringwriter流缓冲区内容
            String content=stringWriter.getBuffer().toString();
            content=content.toUpperCase();
            PageContext context= (PageContext) this.getJspContext();
            //将修改后的content输出到浏览器中
            context.getOut().write(content);
        }
    }
    标签体内小写字母转为大写字母
    <?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>
        <tag>
            <name>simpleTag</name>
            <tag-class>TagDemo.SimpleTagDemo</tag-class>
            <!--简单标签中,body-content中一般设置成empty或scriptless,如果设置成JSP会抛异常;
            传统标签中,body-content中一般设置成empty或JSP;
            如果body-content设置成tagdependent,那么标签体里的内容是给标签处理类使用的,
            例如:标签体里的SQL语句,就可以设置成tagdependent,标签处理器类得到SQL语句处理-->
            <body-content>scriptless</body-content>
        </tag>
        <tag>
            <name>simpleIterationTag</name>
            <tag-class>TagDemo.SimpleIterationTagDemo</tag-class>
            <body-content>scriptless</body-content>
        </tag>
        <tag>
            <name>simpleBodyTag</name>
            <tag-class>TagDemo.SimpleBodyTagDemo</tag-class>
            <body-content>scriptless</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>
    <br/>
    <br/>
    <sdt:simpleTag>简单标签体</sdt:simpleTag>
    <br/>
    <br/>
    <sdt:simpleIterationTag>简单标签体循环5次<br/></sdt:simpleIterationTag>
    <br/>
    <br/>
    <sdt:simpleBodyTag>abccde</sdt:simpleBodyTag>
    <h6>---------------------------------------------</h6>
    <div>
        <h1>自定义标签下面内容</h1>
    </div>
    </body>
    </html>
    JSPDemo

    4、阻止执行标签结束标记符后面所有代码,在doTag方法中抛出javax.servlet.jsp.SkipPageException异常

    package TagDemo;
    
    import javax.servlet.jsp.JspException;
    import javax.servlet.jsp.SkipPageException;
    import javax.servlet.jsp.tagext.SimpleTagSupport;
    import java.io.IOException;
    
    public class SimpleEndPageTagDemo extends SimpleTagSupport {
        @Override
        public void doTag() throws JspException, IOException {
            //抛出SkipPageException异常就可以控制标签余下的JSP不执行
            throw new SkipPageException();
        }
    }
    标签结束符后面所有代码不执行
    <?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>
        <tag>
            <name>simpleTag</name>
            <tag-class>TagDemo.SimpleTagDemo</tag-class>
            <!--简单标签中,body-content中一般设置成empty或scriptless,如果设置成JSP会抛异常;
            传统标签中,body-content中一般设置成empty或JSP;
            如果body-content设置成tagdependent,那么标签体里的内容是给标签处理类使用的,
            例如:标签体里的SQL语句,就可以设置成tagdependent,标签处理器类得到SQL语句处理-->
            <body-content>scriptless</body-content>
        </tag>
        <tag>
            <name>simpleIterationTag</name>
            <tag-class>TagDemo.SimpleIterationTagDemo</tag-class>
            <body-content>scriptless</body-content>
        </tag>
        <tag>
            <name>simpleBodyTag</name>
            <tag-class>TagDemo.SimpleBodyTagDemo</tag-class>
            <body-content>scriptless</body-content>
        </tag>
        <tag>
            <name>simpleEndPageTag</name>
            <tag-class>TagDemo.SimpleEndPageTagDemo</tag-class>
            <body-content>empty</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>
    <br/>
    <br/>
    <sdt:simpleTag>简单标签体</sdt:simpleTag>
    <br/>
    <br/>
    <sdt:simpleIterationTag>简单标签体循环5次<br/></sdt:simpleIterationTag>
    <br/>
    <br/>
    <sdt:simpleBodyTag>abccde</sdt:simpleBodyTag>
    <br/>
    <br/>
    <sdt:simpleEndPageTag></sdt:simpleEndPageTag>
    <h6>---------------------------------------------</h6>
    <div>
        <h1>自定义标签下面内容</h1>
    </div>
    </body>
    </html>
    JSPDemo

    四、tld文件中body-content四种类型简要说明

    简单标签标签体body-content的值只允许是empty,scriptless,tagdependent,不允许是JSP,如果设置成JSP就会抛异常;empty表示没有标签体,scriptless表示可以有标签体,但不能是java代码(即<%java代码%>),tagdependent是给标签处理器类使用的标签体

    传统标签标签体body-content的值可以是empty,scriptless,JSP,tagdependent;JSP允许有标签体,内容任意,包括java代码或EL表达式

  • 相关阅读:
    百度之星 1211 题目一
    acdream 1019 Palindrome 字符串hash
    POJ2480 Longge's problem 欧拉函数
    C#为应用程序注册快捷键
    sql跨数据库查询
    嵌入式轻量级数据库 SQLite和 System.Data.SQLite
    经典问题 C#隐藏和显示窗体
    System.Data.SQLite类Dll下载地址和移植C# SQLite
    CMMI5
    两个ComboBox之间Item的移动
  • 原文地址:https://www.cnblogs.com/hujiapeng/p/5790292.html
Copyright © 2011-2022 走看看