最近在项目过程中遇见了自定义标签这个方法,主要实现了字典式的数据搜索。先在全局文件中定义了某特性属性的开头编码 如: 学期 ,定义开头为 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告诉画面继续执行剩余的画面,我这边举例暂时没写后者。