• 什么是标签库

  标签库是jsp页面要使用的标签元素的集合,前面笔记总结的都是默认的标签,容器提供了另外几套标准标签库和用户自定以标签库来零化jsp页面中java代码,我将不笔记标准标签  库的各个细则,只约略记录一下sun公司提供的几个标签有:c/fmc/sql/x/fn几个前缀标识,它封装了程序员常用的一些标签,我个人是不提倡用这些标签因为难以记忆,如果有公司  采用这样的技术手段,只需要查规范即可,标签本质上只是java代码的标签化而已。然后如果有公司使用自定义标签库,则只需要知道标签库如何自定义和使用即可。下面的内容  将围绕自定义标签展开。

       一个标签的组成

  标签概念的完全组成部分是空标签、标签属性和标签体。自定义的标签实际上就是实现了传统标签和简单标签接口的java类,然后完成标签类的部署工作后,程序员就可以在jsp中  使用。

  1. 标签接口在容器中的生命周期:

  javax.servlet.jsp.tagext.Tag接口作为顶级接口定义了标签需要实现的基本方法,其相关类的静态层次这里忽视,只约略笔记相关的几个周期方法:

  1.1容器在创建标签处理器的实例后(需要部署告知容器),调用setPageContext()方法设置标签的页面上下文,然后调用setParent()设置此标签的父标签,没有则为null;

  1.2调用标签处理器的setXXX(),设置标签的属性,如果jsp中的标签定义属性则没有这一步骤;

  1.3调用doStartTag()方法,如果返回EVAL_BODY_INCLUDE常量(接口中定义的),则将标签体输出到当前的输出流中;如果返回SKIP_BODY则忽略标签体。

  1.4调用doEndTag()方法,返回PAGE,则执行jsp页面之余,返回SKIP_BODY则忽略页面之余;和上一步骤类似,该步骤中的代码会原样编写进jsp对应的servlet代码中。

  1.5容器缓存该实例,重复使用;

  1.6需要释放该实例时,调用release();

  知道了其生命周期后,我们就可以实现简单标签或传统标签接口,在对应的方法中写入合适的处理内容。

   2.标签实现类的部署

  完成标签处理器的编写后,需要告知容器该处理器的信息,让容器拥有对处理器的管理权。

  2.1标签库描述符(Tag Library Descriptor,TLD)

  编写.tld文件到META-INF或WEB-INF目录下(最好创建自目录tags),下面贴上一个案例:

  代码结构

  JSP规范_Tag Library标签库

  编写便签处理器HelloTag.java

package tags;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;

//实现传统标签接口
public class HelloTag implements Tag{
    private PageContext pageContext;
    private Tag parent;
    //设置context对象
    public void setPageContext(PageContext pc) {
        this.pageContext=pc;
    }
    //如果标签嵌套,设置父标签
    public void setParent(Tag t) {
        this.parent=t;
    }
    //获取父标签
    public Tag getParent() {
        return parent;
    }
    //当处理标签时,该方法被调用
    public int doStartTag() throws JspException {
        return SKIP_BODY;//有效返回值0,跳过body评估,即忽略标签体
    }
    //当处理结束时,该方法被调用
    public int doEndTag() throws JspException {
        JspWriter out = pageContext.getOut(); 
        try {
            out.println("欢迎来到我的个人网站!");
        }catch(IOException e) {
            System.out.println(e.toString());
        }
        return EVAL_PAGE;//返回6,继续评估该page,即jsp页面的余下部分继续执行
    }
    @Override
    public void release() {}//释放标签处理器资源
    
}
View Code

相关文章:

  • 2021-11-23
  • 2021-11-02
  • 2021-09-01
  • 2021-11-26
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-08-15
  • 2022-12-23
  • 2021-09-09
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案