- 什么是标签库
标签库是jsp页面要使用的标签元素的集合,前面笔记总结的都是默认的标签,容器提供了另外几套标准标签库和用户自定以标签库来零化jsp页面中java代码,我将不笔记标准标签 库的各个细则,只约略记录一下sun公司提供的几个标签有:c/fmc/sql/x/fn几个前缀标识,它封装了程序员常用的一些标签,我个人是不提倡用这些标签因为难以记忆,如果有公司 采用这样的技术手段,只需要查规范即可,标签本质上只是java代码的标签化而已。然后如果有公司使用自定义标签库,则只需要知道标签库如何自定义和使用即可。下面的内容 将围绕自定义标签展开。
一个标签的组成
标签概念的完全组成部分是空标签、标签属性和标签体。自定义的标签实际上就是实现了传统标签和简单标签接口的java类,然后完成标签类的部署工作后,程序员就可以在jsp中 使用。
- 标签接口在容器中的生命周期:
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),下面贴上一个案例:
代码结构:
编写便签处理器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() {}//释放标签处理器资源 }