欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

jsp_自定义简单标签

程序员文章站 2022-06-09 09:49:20
...
1: 自定义简单标签
    1): 为什么要自定义标签, 因为当内置标签与JSTL标签等不能满足我们的需求时
        这时则需要我们程序员自定义一些功能标签

2: 自定义标签入门
    1): 创建一个标签处理类,需要继承SimpleTagSupport类(这个类会实现SimpleTag接口)
    2): 重写doTag方法,在这个方法里边可以写我们的逻辑代码(这个doTag由容器来调用)
        如: public class HelloTag extends SimpleTagSupport{
                @Override
                public void doTag() throws JspException, IOException {
                    System.out.println("Hello 小红");
                }
            }
    3): 接着在WEB-INF目录下创建.tld标签库文件,把页面的标签与标签处理类关联起来
        <?xml version="1.0" encoding="UTF-8" ?>
        <taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
            version="2.1">
            <!-- 描述 -->
            <description>tz 1.0 core library</description>
            <!-- 显示名称 -->
            <display-name>tz core</display-name>
            <!-- 版本 -->
            <tlib-version>1.0</tlib-version>
            <!-- 建议使用的标签前缀 -->
            <short-name>tz</short-name>
            <!-- tld文件的唯一标识 -->
            <uri>http://www.tz.com/jsp/tz/core</uri>

            <tag>
                <!-- 标签名 -->
                <name>hello</name>
                <!-- 标签处理类的全类名 -->
                <tag-class>com.tz.servlet.tag.HelloTag</tag-class>
                <!-- 标签体的格式 -->
                <body-content>empty</body-content>
            </tag>
        </taglib>
    4: 在taglib指定引入自定义标签即可
    5: 在页面就能使用  如: <tz:hello/>  


2: 在标签处理中获取九个对象
    因为容器会自动调用simpleTag接口的setJspContext(JspContext pc)方法,且会把一个PageContext对象传入
    所以我们可以通过这个方法拿到那个传入的PageContext对象,从而拿到其它的对象
    因为继承SimpleTagSupport类已经实现了SimpleTag接口,且给我们提供了一个getJspContext方法来获取PageContext对象
    所以我们可以直接通过this.getJspContext()即可获取



3: 自定义带属性的标签
    1): 在tld文件中配置添加<attribute>标签
    如:  <tag>
            <name>myset</name>
            <tag-class>com.tz.servlet.tag.SetTag</tag-class>
            <body-content>empty</body-content>
            <attribute>
                <!-- 属性名 -->
                <name>var</name>
                <!-- 表示 这个属性是否必须 的 -->
                <required>true</required>
                <!-- 表示这个属性是否 可以接收 运行时的表达式的值(如 EL表达式) -->
                <rtexprvalue>false</rtexprvalue>
            </attribute>
        </tag>
    2: 在自定义的java类可以设置成员变量和set方法来设置接收属性值
        变量我即就是标签中的属性名
    ps: 属性名要与标签处理类里的属性一样


4: 自定义一个可以输出标签体的标签
    1): 先需要在标签处理类中拿到一个封装标签体信息的对象--JspFragment对象
    2): 因为容器在调用setsetJspBody(JspFragment jspBody)会把这个对象传入,即我们可以在这个方法里来获取,也可以直接this.getJspBody()直接获取
    3): 在doTag方法中使用JspFragment对象的方法jspBody.invoke(Writer w)把信息从一个Writer中输出
        @Override
        public void doTag() throws JspException, IOException {
            PageContext pageContext = (PageContext) this.getJspContext();
            //判断test属性值 是"true" 还是 "false"
            if("true".equalsIgnoreCase(test)) {
                JspFragment jspBody = this.getJspBody();
                /*
                StringWriter sw = new StringWriter();
                //获取标签体的信息
                jspBody.invoke(sw);
                String value = sw.toString();           
                //向浏览器输出标签体的信息
                pageContext.getOut().write(value);
                */
                //如果invoke方法里的参数为null,则会直接输出 
                jspBody.invoke(null);
            }
        }
    ps: 因为继承的SimpleTagSupport类有实现SimpleTag接口且给我们提供了一个getJspBody方法来获取JspFragment对象
        所以我们可以直接this.getJspBody()即可以拿到JspFragment对象
    ps: 对于invoke(Writer w)方法 如果 里边的参数为null, 则就会直接向页面输出内容
    4): 在tld在配置
        <tag>
            <name>myif</name>
            <tag-class>com.tz.servlet.tag.IfTag</tag-class>
            <!-- 设置标签体的格式 -->
            <body-content>tagdependent</body-content>
        </tag>
    ps: 标签体内容的格式一般有如下几种
        empty: 没有标签体
        scriptless: 有标签体,且表示,可以在标签体里边使用EL表达式或者jsp标签
        tagdependent: 有标签体, 会把内容完全交给标签本身处理,把内容原封不动的输出

5: 自定义标签父-子标签
    如:  <tz:parent scope="application">
            <tz:son var="name" value="小红妹妹"/>
        </tz:parent>
    ps: 父标签是把子标签把标签内容输出的,所以要注意在父标签的doTag方法输出
相关标签: jsp