jsp_自定义简单标签

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方法输出
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值