自定义标签库_tag

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;
    }
}
View Code

  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()获得标签体的内容

原文地址:https://www.cnblogs.com/vhyc/p/6626756.html