编写标签对应的实现类并继承BodyTagSupport类,一般需要重载BodyTagSupport类几个方法:doStartTag(), setBodyContent(), doInitBody(), doAfterBody(), doEndTag();
他们执行顺序是doStartTag()-->doInitBody()-->setBodyContent()-->AfterBody()-->EndTag()
doStartTag()方法可返回EVAL_BODY_INCLUDE或SKIP_BODY;
如果返回EVAL_BODY_INCLUDE则继续执行;
如果返回SKIP_BODY则接下来的doInitBody(),setBodyContent(), doAfterBody()三个方法不会被执行,
而直接执行doEndTag()方法。
setBodyContent()方法用于设置标签体内容,如果在此之前要作一些初始化工作,则在doInitBody()方法中完成。
标签体内容执行完后,会调用doAfterBody()方法,此方法可返回EVAL_BODY_TAG, SKIP_BODY,
EVAL_PAGE或SKIP_PAGE。
如果返回EVAL_BODY_TAG则会再次设置标签体内容,直到返回SKIP_BODY;
如果返回EVAL_PAGE则标签体执行完后会继续执行JSP页面中接下来的部分;
如果返回SKIP_PAGE,则JSP页面的后续内容将不再执行。
自定义JSP标签的一般步骤
1)编写标签处理类,如:
public class ForumPagerTag extends BodyTagSupport{
private String name;
private String url;
public int doStartTag() throws JspException {
.....
return EVAL_PAGE;
}
}
2)创建标签库描述符(TLD),如:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>page</shortname>
<uri>http://www.xx.com.cn/tags/forumtaglib-pager</uri>
<tag>
<name>pager</name>
<tagclass>pager.taglib.ForumPagerTag</tagclass>
<attribute>
<name>name</name>
<required>true</required>
</attribute>
<attribute>
<name>url</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
3)web.xml配置标签库
<taglib>
<taglib-uri>http://www.xx.com/tags/forumtaglib-pager</taglib-uri>
<taglib-location>
/WEB-INF/tld/forumtaglib-pager.tld
</taglib-location>
</taglib>
4) 在JSP页面中使用标签,如:
<%@ taglib uri="http://www.xx.com.cn/tags/forumtaglib-pager" prefix="forumPager" %>
<forumPager:pager url="${ctx}/ebusiness/portal/portalpostsAction!findPosts.action" name="pc">
</forumPager:pager>