JSP 定制标签

来源:互联网 发布:上海交通大学知乎 编辑:程序博客网 时间:2024/05/16 04:42

 一 标签库的使用举例

对于我们自定义标签,一定要继承javax.servlet.jsp.tagext.TagSupport类,或者是javax.servlet.jsp.tagext.BodyTagSupport类,根据实际需要,重写其doStartTag、doEndTag方法,一般没有循环需要的话,对于其doAfterBodyTag方法不必实现,示例如下:

  

[java] view plaincopy
  1. public class TimerTag extends TagSupport{  
  2.   
  3.     private long start;  
  4.     private long end;  
  5.   
  6.     public int doStartTag(){  
  7.         start = System.currentTimeMillis();  
  8.         return EVAL_BODY_INCLUDE;  
  9.     }  
  10.   
  11.     public int doEndTag() throws JspTagException{  
  12.         end = System.currentTimeMillis();  
  13.         long elapsed = end - start;  
  14.         try{  
  15.             JspWriter out = pageContext.getOut();  
  16.             out.println("running time:" + elapsed + " ms");  
  17.         }catch (Exception e){  
  18.             throw new JspTagException(e);  
  19.         }  
  20.         return EVAL_PAGE;  
  21.     }  
  22. }  

 创建TLD文件,它是一个标准的XML文件,示例如下:

[xhtml] view plaincopy
  1. <?xml version="1.0" encoding="ISO-8859-1" ?>  
  2. <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">  
  3. <taglib>  
  4.     <tlib-version>1.0</tlib-version>  
  5.     <jsp-version>1.2</jsp-version>  
  6.     <short-name>util</short-name>  
  7.     <uri>http://www.ych.com/util</uri>  
  8.     <!--OutputTag-->  
  9.     <tag>  
  10.         <name>util</name>  
  11.         <tag-class>com.ych.TimerTag</tag-class>  
  12.         <body-content>JSP</body-content><!-- Empty:cannot contain other contents;JSP:can contain jsp code -->  
  13.         <attribute>  
  14.             <name>timer</name>  
  15.             <required>true</required>  
  16.             <rtexprvalue>false</rtexprvalue>  
  17.         </attribute>  
  18.     </tag>  
  19. </taglib>  

创建JSP页面,使用标签库,如下:

 

[xhtml] view plaincopy
  1. <%@ page language="java" contentType="text/html; charset=utf-8"  
  2.     pageEncoding="utf-8"%>  
  3. <%@taglib prefix="util" uri="http://www.ych.com/util"%>  
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  5. <html>  
  6. <head>  
  7. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
  8. <title>title</title>  
  9. </head>  
  10. <body>  
  11. <util:timer> hahaha</util:timer>  
  12. </body>  
  13. </html>  

以上就是自定义标签库的基本用法,运行之后会在页面上输出运行时间。

二 TagSupport工作流程

TagSupport

 

      SKIP_BODY 表示不用处理标签体,直接调用doEndTag()方法。
   
    SKIP_PAGE 忽略标签后面的JSP内容。
   
  EVAL_PAGE 处理标签后,继续处理JSP后面的内容。
   
  EVAL_BODY_BUFFERED 表示需要处理标签体。
   
  EVAL_BODY_INCLUDE 表示需要处理标签体,但绕过setBodyContent()和doInitBody()方法
   
  EVAL_BODY_AGAIN 对标签体循环处理。


注:继承TagSupport 和继承BodyTagSupport 的区别在于后者能够对标签内的内容进行处理,其处理流程如下:

 

三 常用开源标记库

   JSTL,Jakarta Taglibs,Display Tag

0 0