自定义taglib标签

     最近在项目过程中遇见了自定义标签这个方法,主要实现了字典式的数据搜索。先在全局文件中定义了某特性属性的开头编码  如:  学期  ,定义开头为  9527    然后9527 加1即  95271为第1学期,95272为第二学期,一次类推。然后通过自定义标签的方式,在数据库拿到1后和9527进行拼接,在画面进行判断显示当前学期 。换个例子。。。 ‘特征’ 的前缀为 12306   123061为帅 123062为丑之类的。。。(举得不太好,但是就是这种用法),我见了觉得很有意思,于是自己简单写了一个很弱鸡的例子。其实在工作中很少会去自定义标签,所以只需大体理解其思想即可,以下只为很浅的举例。

 

1.首先需要定义一个tld文件(taglib的配置文件),一般选择在web-inf/下目录中建立

2.需要定义xml头信息 <?xml version="1.0" encoding="UTF-8"?> 这个一般貌似好像自带。。。

3.需要引入dtd约束,方便书写代码,下面这个版本可能有点老了,反正能先用着。。。
<!DOCTYPE taglib 
    PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" 
    "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_2.dtd">

4.需要设定参数值

     1.taglib版本,2.适用jsp版本,3.推荐prefix头,4.jsp中tld文件uri引用时的路径别名。也可以在jsp直接写该tld文件位置来代替这个路径别名
    <tlib-version>1.0</tlib-version>
    <jsp-version>1.2</jsp-version>
    <short-name>nmy</short-name>
    <uri>http://oidgeduc.dictionary/display</uri>

5.设定tag内容,即画面要调用的方法 类似于常用的 c:if  后面的if就是你定义的方法
   1.设定name属性,即画面方法名, 

   2.tag-class实现类,即调用你定义的方法时,所做处理的类

   3.attribute为参数,参数中,name为参数名,required是否为必填,rtextprvalue是否可以动态指定,即是否可以通过类似于el表达式这样填入变量->oneP=${变量}
   4.type数据类型

   5.具体代码如下:
    <tag>
        <name>sum</name>
        <tag-class>
            com.ntt.tag.taglibService
        </tag-class>
        <attribute>
            <name>oneP</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
            <type>java.lang.Integer</type>
        </attribute>
        <attribute>
            <name>twoP</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
            <type>java.lang.Integer</type>
        </attribute>
    </tag>

6.上述定义完taglib的配置文件后,需要对书写处理类,即tag-class标签中定义的类。

   代码如下所示:

public class taglibService extends TagSupport{
    private Integer oneP;    //此处是taglib配置中作为参数传入,会注入到其中
    private Integer twoP;
    
    public int doStartTag() throws JspException {

        // 通过pageContext.getRequest()拿到request对象,放入最后的求和值,以便前台取出
        pageContext.getRequest().setAttribute("sum", oneP + twoP);
        return SKIP_BODY;  //返回值为SKIP_BODY 表示执行的时候,需要页面等待
    }

    public Integer getOneP() {
        return oneP;
    }

    public void setOneP(Integer oneP) {
        this.oneP = oneP;
    }

    public Integer getTwoP() {
        return twoP;
    }

    public void setTwoP(Integer twoP) {
        this.twoP = twoP;
    }
}

7.补充:

     自定义标签类得继承tagsupport或者simpletagsupport,以下以前者为例。
需要重写他的方法,doStartTag(),一般主要只写这个,表示在读到标签开始执行,返回值为SKIP_BODY
执行的时候,需要页面等待。然后doEndTag为读到结束标签后执行,返回EVAL_PAGE告诉画面继续执行剩余的画面,我这边举例暂时没写后者。

   

转载于:https://my.oschina.net/huaizhe/blog/1625546

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值