如果在自订标签库时,并不需要对标签本体作处理,则您可以继承TagSupport类别,TagSupport类别实作了Tag与 IterationTag介面,IterationTag介面则是Tag介面的子介面,TagSupport类别替您预先实作了这两个介面中的方法,在继承TagSupport之后,您视需要来改写当中的一些方法(这是 Default Adapter模式)。
Tag介面中与标签处相关的方法主要有:doStartTag()、doEndTag()。其中doStartTag()方法是遇到标签开始时会呼叫的方法,其合法的回传值是EVAL_BODY_INCLUDE与SKIP_BODY,前者表示将显示标签间的本体文字,后者表示不显示标签间的本体文字;doEndTag()方法是在遇到标签结束时呼叫的方法,其合法的回传值是EVAL_PAGE与SKIP_PAGE,传回前者表示处理完标签后继承执行以下JSP网页,传回后者则表示不处理接下来的JSP网页。
IterationTag介面继承Tag介面,在标签处理上增加了doAfterBody(),这个方法是在显示完标签间文字本体之后呼叫的,其合法的回传值有EVAL_BODY_AGAIN与SKIP_BODY,如果传回前者,则会再显示一次标签间的文字本体,传回后者则继承执行标签处理的下一步。
TagSupport类别实作了Tag与IterationTag介面,其预设的回传值是:doStartTag()回传 SKIP_BODY、doAfterBodyTag()回传SKIP_BODY、doEndTag()回传EVAL_PAGE。所以在继承 TagSupport之后,如果没有改写任何的方法,则在标签处理上执行的顺序是:
package onlyfun.caterpillar; import java.io.*; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; public class GuardTag extends TagSupport { public int doStartTag() throws JspException { String valid = pageContext.getRequest().getParameter("valid"); // 如果flag设定为key,就显示本体文字内容 if(valid.equals("valid_user")) { return EVAL_BODY_INCLUDE; } return SKIP_BODY; } }
<?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/j2ee web-jsptaglibrary_2_0.xsd" version="2.0"> <description>Tag Demo</description> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>TagDemo</short-name> <uri>/TagDemo</uri> <tag> <description>Cuard BodyText</description> <name>guard</name> <tag-class>onlyfun.caterpillar.GuardTag</tag-class> <body-content>JSP</body-content> </tag> </taglib>
<%@taglib prefix="caterpillar" uri="http://caterpillar.onlyfun.net/"%> <html> <body> 这个网页包括受保护的内容OOOXXXX。。。。。。<p> <caterpillar:guard> ${ param.user }, 您好,幸运密码是 oooxxx ! </caterpillar:guard> </body> </html>