WEB容器在编译JSP网页时,如果遇到自定义的标签,将会在由JSP页面生成的Servlet中调用这个标签处理类,处理标签的类必须是javax.servlet.jsp.tagext.TagSupport类的直接或间接子类javax.servlet.jsp.tagext.BodyTagSupport,继承关系如图所示。
图 BodyTagSupport的继承关系
一、标签处理类
在TagSupport中定义了一些与Servlet容器处理TAG开关相关的方法,主要有如下一些:
1. doStartTag()
Servlet容器遇到自定义标签的起始标志时调用该方法。
2. doEndTag()
Servlet容器遇到自定义标签的结束结志时调用该方法。
3. setValue(String k,Object o)
在标签处理类中设置key / value。
4. getValue(String k)
在标签处理类中根据参数key返回相应的value。
5. removeValue(String k)
删除标签处理类中的相应的key / value 。
6. setPageContext(PageContext pc)
设置PageContext对象,该方法由Servlet容器在调用doStartTag或doEndTag方法前调用
7. setParent(Tag t)
设置嵌套了当前标签的上层标签的处理类,该方法由Servlet容器在调用doStartTag或doEndTag方法前调用。
8. getParent()
返回嵌套了当前标签的上层标签的处理类。
标签处理类中有两个比较重要的属性:
1. parent:代表了嵌套了当前标签的上层标签的处理类。
2. pageContext:代表了Web应用中的javax.servlet.jsp.PageContext对象。
pageContext类提供了保存及访问WEB应用共享数据的方法,包括下面两个常用的方法:
方法一:public void setAttribute(String name,Object value, int scope)
表示在PageContext中设置属性的值。
方法二:public Object getAttribute(String name, int scope)
表示从PageContext中取得属性的值。
scope用来指定数据的作用范围。可选值如下:
l PageContext.PAGE_SCOPE:表示作用范围为一个JSP页面。
l PageContext.REQUEST_SCOPE:表示请求作用域,就是客户端的一次请求。
l PageContext. SESSION_SCOPE:会话作用域,当用户首次访问时,产生一个新的会话,以后服务器就可以记住这个会话状态。生命周期结束或会话超时,服务器端会强制使会话失效。
l PageContext.APPLICATION_SCOPE:全局作用范围,整个应用程序共享,就是在部署文件中同一个WEB目录下应用的共享,生命周期为应用程序启动到停止。
以上作用范围按顺序越来越大, request和page的生命周期都是短暂的,他们之间的区别就是:一个request可以包含多个page页。
Servlet容器在调用doStartTag()或doEndTag()方法前,会先调用setPageContext()和setParent()方法,设置pageContext和parent的值。
在doStartTag()或doEndTag()方法中可以通过getParent()方法获取上层标签的处理类,在TagSupport类中定义了protected类型的pageContext成员变量,因此在标签处理类中可以直接访问pageContext变量。
二、JSP标签的实现
要实现自定义的标签,应该要实现前面介绍的描述文件、标签处理类、修改web.xml文件以及在JSP页面中引用自定义的标签。下面为一个简单的自定义标签,当JSP页面中引用了自定义标签时,把标签的内容用“Hello Kitty!!”代替,代码如下所示。
“Hello Kitty”标签
//1. JSP页面
http://www.free.com/taglibs/HelloKitty" %>
//2. web.xml文件标签定义
http://www.free.com/taglibs/HelloKitty
/WEB-INF/HelloKitty.tld
//3. 标签描述文件
BR> PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">
1.0
1.2
message
http://www.free.com/taglibs/HelloKitty
sayHello
com.free.taglib.HelloKittyTag
empty
//4. 标签实现类
public class HelloKittyTag extends TagSupport {
public int doEndTag() {
try {
pageContext.getOut().print("Hello Kitty!!");
} catch (IOException ignored) {
}
return EVAL_PAGE;
}
}
上例通过JSPàweb.xmlà标签描述文件à标签实现类完整的展示了一个自定义标签的实现,JSP文件的显示效果如图所示。
图 JSP引用自定义标签的显示效果
提示:在标签处理类中还能处理非常复杂的逻辑,从而把复杂和重复的代码从JSP页面中分离出来,这也是标签存在的理由之一。
image001.jpg
image002.jpg
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13081368/viewspace-441966/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/13081368/viewspace-441966/