自定义标签开发

自定义标签

自定义标签主要用于移除JSP页面中的Java代码。
一般自定义标签实现的目的:
1. 控制JSP页面中某一部分内容是否执行
2. 控制整个JSP页面是否执行
3. 控制JSP页面内容重复执行
4. 修改JSP页面的输出

实现概述

  1. 编写一个实现Tag接口的Java类,把页面中的java代码移到这个java类中。(这个类应该叫标签处理器类)
  2. 别写一个标签库描述符(tld)文件,在tld文件把标签处理器类描述成一个标签。

    使用时引入标签库即可

传统标签 与 简单标签

根据标签处理器类实现标签接口的不同,将自定义的标签分为传统标签和简单标签。
传统标签:实现Tag。
简单标签: 实现SimpleTag。

传统标签

继承Tag的默认实现类TagSupport
一般我们会重写doStartTag()方法,即将java代码放在这个方法中。
TagSpport类还有的几个方法有 setPageContxt()、setParent()、doEndTag()等方法

传统标签的运行原理:
1. 遇到自定义标签,首先实例化标签对应的标签处理器类。
2. 调用setPageContext()方法,将页面的pageContext对象传递给标签处理器类
3. 查看标签是否有父标签,如果有父标签,则把父标签作为一个对象,调用setParent()方法传递给自定义标签对象(开始实例化的)。
4. 完成以上初始化工作,服务器开始执行标签,遇到开始标签就调用doStartTag()方法
5. 如果有标签体的话,一般会执行标签体
6. 遇到结束标签,调用doEndTag()方法。
7. 整个标签执行完毕后,服务器会调用doRelease()方法

简单标签

继承SimpleTag的默认实现类SimpleTagSupport

  • 简单标签中一般我们重写doTag()方法,即将java代码放在这个方法中。
    SimpleTagSupport类的几个其他方法为: getParent(), setParent()、setJspBody()、setJspContext()。

方法的调用过程为: setJspContext() –> setParent() –> setJspBody() –> doTag()

  • 在标签库描述符(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/jsee/web-jsptagLibrary_2_0.xsd"
    version="2.0">
    <tlib-version>1.2</tlib-version>

    <uri>simpleTags</uri>
        <tag>
            <name>simple1</name>
            <description>xxxxxxxx</description>
            <tag-class>foo.SimpleTagTest1</tag-class>
            <body-content>empty</body-content>  // -> <body-content>scriptless</body-content>
        </tag>
    </taglib>
使用简单标签实现一些功能

NT: 以下功能的实现都是在doTag()方法中执行的。

  1. 控制标签体是否执行
    JspFrament jf = this.getJspBody(); //得到代表标签体的对象
    jf.invoke(this.getJspContext().getOut()); //将标签体写给浏览器, 即标签体执行
    //在这里 如果什么都不写,就什么都不输出, 即标签体不执行
    //jf.invoke(null); —> 也是执行标签(只不过,默认将标签内容写给浏览器)
  2. 迭代标签体
    for(int i = 0; i < 5; i++)
    {
    jf.invoke(null); //控制标签体执行5次
    }

  3. 修改标签体
    StringWriter sw = new StringWriter(); //带缓冲的Writer
    jf.inovke(sw); //写到缓冲
    String content = sw.toString(); //获取标签体内容
    /* 修改内容 …..*/
    this.getJspContext().getOut().write(content); //手动写给浏览器

  4. 控制余下的JSP代码不执行
    throw new SkipPageException(); //抛出这个异常

开发带属性的标签

步骤:
1. 在标签处理器中编写每个属性对应的set方法
2. 在tld文件中描述标签的属性、

    <tag>
        <attribute>
            <name>count</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>   //如果是true的话,可以使用EL表达式赋值
            <type>Integer</type>           //这样会检查传入的参数是否正确。
        </attribute>
    <tag>

打包标签库

第一步:准备工作
1.创建一个目录:例如tag-libraries
2.在tag-libraries下创建另外一个目录:META-INF(必须的)
3.将你编写的“.tld”文件放入“META-INF”目录中,返回tag-libraries
4.将你的class文件带包放入此目录中:例如com.cheng.……

第二步:打包成jar
1.运行cmd,输入命令:jar cvf my-taglib.jar META-INF com

(在eclipse中 直接javaProject-> import -> JarFile)

第三步:加入的web工程中的lib文件夹中

第四步:jsp页面上引用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值