1)最简单的标签库
1,继承Tag接口,重写doEndTag()方法,返回类型不同后面流程不一样
想要jsp的内容必须重写了setPageContent()方法
再JspWriter out = pageContext.getOut();
package myTag; import java.io.IOException; import java.util.ResourceBundle; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.Tag; public class Copyright implements Tag { private PageContext pageContext; private Tag parent; @Override public int doEndTag() throws JspException { // TODO Auto-generated method stub JspWriter out = pageContext.getOut(); try { out.println("<div align=center style='line-height:22px;" + "font-size:12px;'>"); out.println(ResourceBundle.getBundle("copyright").getString( "copyright")); out.println("</div>"); } catch (IOException e) { throw new JspException(e); } return EVAL_PAGE; } @Override public int doStartTag() throws JspException { // TODO Auto-generated method stub return SKIP_BODY; } @Override public Tag getParent() { // TODO Auto-generated method stub return this.parent; } @Override public void release() { // TODO Auto-generated method stub } @Override public void setPageContext(PageContext pc) { // TODO Auto-generated method stub this.pageContext = pc; } @Override public void setParent(Tag t) { // TODO Auto-generated method stub this.parent = t; } }
2,在WEB-INF/目录下创建tld文件(new/other创建
bodycontent有三个值,empty表示不可以有标签体,jsp表示可以有标签体,tagdependent可以有但不会执行
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name>taglib</short-name> <tag> <name>copyright</name> <tagclass>myTag.Copyright</tagclass> <bodycontent>JSP</bodycontent> </tag> </taglib>
3,由于我用了资源文件
ResourceBundle.getBundle("copyright").getString("copyright")
所以src文件下一定要有这个文件的copyright属性
4,在jsp中首先声明,<%@ taglib uri="WEB-INF/xxx.tld" prefix="taglib">
下面就可以<taglib:copyright/>
2)带属性的第标签
TagSupport类实现了Tag接口,根据需要重写你的doStartTag或者doEndTag方法就好了
在类里面定义了这个private属性和setter方法
在tld文件也要去添加修改<attribute>
<attribute> <name>name</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute>
<required>表示是否必需的
<rtexprvalue>表明是否允许EL表达式或者<%= %>
当有多个参数的时候照样子添加private属性和setter方法
3)带标签体的标签
这时候我们可以使用BodyTagSupport来获得更加丰富的控制,如doInitBody()和doAfterBody()方法
不过他们在进行doStartTag或者doEndTag的方法的时候都会返回常量
SKIP_BODY=0//不跑标签体
EVAL_BODY_INCLUDE=1//跑标签体
SKIP_PAGE=5//强行结束
EVAL_PAGE=6//正常结束
使用this.getBodyContent().getString()获得标签体的内容