在用Spring做开发的时候,可以自己写个标签来实现一些特殊的处理,比如说页面操作权限验证等。其实一个Tag对应着一个java类,该类继承了TagSupport(也可以扩展其他类来实现)。TagSupport实现了Tag接口,该类提供了四个常用的方法
1) doStartTag():
jsp容器在解释jsp页面时,遇到自定义标签,会先建立一个便签处理对象,经过必要的处理之后,调用这个方法,该方法中根据需要添加自己的逻辑处理。改方法有可以有两个返回值SKIP_BODY和EVAL_BODY_INCLUDE.
下面举个例子说明这两个返回值的效果
在某个jsp页面有一下自定义的标签
<tag :tagName property=”someValue”><ahref=”#”>删除</a></tag:tagName>
当方法返回SKIP_BODY的时候,这个“删除”操作时不会显示在页面中的,然后调用doEndTag方法
当方法返回EVAL_BODY_INCLUDE.时,会在页面中显示“删除”操作,然后执行doAfterTag操作
这个小例子可以达到处理页面操作权限的问题。
也就是说,SKIP_BODY对标签体不做处理,而后者会正常执行标签体里面的代码(但是不会做任何额外的处理)
2)doAfterBody
返回EVAL_BODY_AGAIN:重复执行标签体的内容
返回SKIP_BODY:不用重复处理标签体,直接运行doEndTag方法,该方法的默认返回值就是SKIP_BODY
3)doEndTag()
遇到自定义标签体结束时调用该方法
可选返回值也有两个
SKIP_PAGE:标签后面的jsp代码会被忽略,中止了JSP页面的执行
EVAL_PAGE:与SKIP_PAGE相反,会在标签体处理完后继续处理后面的JSP内容,这是是默认的返回值
4) release()
释放所获取的资源
所以自定义标签的流程图如下所示
自定义标签应用举例:判断用户是否是管理员,如果是就显示系统管理选项,否则不显示。
标签代码如下
public class AuthenticateTag extends TagSupport { /**用户种类*/ private String type; public AuthenticateTag() { } public String getType() { return type; } public void setType(String type) { this.type = type; } @Override public int doStartTag() throws JspException { if(this.type.equals("root")){ return EVAL_BODY_INCLUDE; } return SKIP_BODY; } @Override public void release() { this.type=""; super.release(); } }
下面这个标签的tld文件的配置信息,该文件在WEB-INF目录下的tld文件夹中,命名为tv.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/javaeehttp://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" version="2.1"> <description>TV TAG</description> <display-name>TV TAG</display-name> <tlib-version>1.1</tlib-version> <short-name>tv</short-name> <!-- jsp页面调用时会用到 --> <uri>tv.huan</uri> <!-- 权限标签 --> <tag> <description>your description</description> <!-- 该tag的名字/别名 --> <name>authenticate</name> <!-- 该标签所在的地址 --> <tag-class>org.elfinder.servlets.core.AuthenticateTag</tag-class> <body-content>JSP</body-content> <!-- 标签具有的属性,也就是类AuthenticateTag中定义的属性--> <attribute> <description> Your description </description> <name>type</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
下面在jsp页面中调用此标签
1) 引入标签<%@ taglib uri="tv.huan" prefix="tv"%>,注意uri对应tld文件中的uri内容
2) 应用标签<前缀:标签类的别名>
<tv:authenticate type="${type}"> <li class="active_user"><a href="<c:url value="/admin/user"/>"></a><span class="icon">U</span>用户管理</li> </tv:authenticate>
当然标签也可以用作其他用途:比如在页面展示中字符串过长可以经过自定义标签处理后显示一部分,剩下的用”…”代替,分页处理也可以用标签处理等等