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