JSP 自定义标签

  自定义标签是用户定义的JSP语言元素。当JSP页面包含一个自定义标签时将被转化为servlet,标签转化为对被 称为tag handler的对象的操作,即当servlet执行时Web container调用那些操作。

  JSP标签扩展可以让你创建新的标签并且可以直接插入到一个JSP页面。 JSP 2.0规范中引入Simple Tag Handlers来编写这些自定义标记。

你可以继承SimpleTagSupport类并重写的doTag()方法来开发一个最简单的自定义标签

开发步骤

  接下来,将开发一个自定义标签,功能是将long类型的时间,转化成时间的字符串。

  1. 要创建自定义的JSP标签,你首先必须创建处理标签的Java类。所以,让我们创建一个LongDateTag类,如下所示:
1 package com.tag;
  2 
  3 import java.io.IOException;
  4 import java.text.SimpleDateFormat;
  5 import java.util.Calendar;
  6 
  7 import javax.servlet.jsp.JspException;
  8 import javax.servlet.jsp.PageContext;
  9 import javax.servlet.jsp.tagext.TagSupport;
 10 
 11 
 12 /**
 13  * 
 14  * 自定义JSTL标签类
 15  *  处理:1.long类型时间转换字符串
 16  * 
 17  * @author H__D
 18  *
 19  */
 20 public class LongDateTag extends TagSupport{
 21 
 22     
 23 
 24     private PageContext pageContext;
 25     
 26     private String value;
 27     private String partten;
 28     
 29     //设置PageContext对象
 30     public void setPageContext(PageContext pageContext) {
 31         
 32         //System.out.println("设置PageContext对象!");  
 33         this.pageContext = pageContext;
 34     }
 35     
 36     
 37     public void setValue(String value)
 38     {
 39         this.value = value;
 40     }
 41     public void setPartten(String partten)
 42     {
 43         this.partten = partten;
 44     }
 45     
 46     
 47     
 48     
 49     /**
 50      * 标签开始处理..调用的方法
 51      * 
 52      */
 53     @Override
 54     public int doStartTag() throws JspException {
 55         String vv = String.valueOf(value);
 56         System.out.println(vv);
 57         Long time = Long.valueOf(vv);
 58         Calendar calendar = Calendar.getInstance();
 59         calendar.setTimeInMillis(time);
 60         if(partten == null || partten.trim().length() == 0)
 61             partten = "yyyy-MM-dd HH:mm:ss.SSS";
 62         SimpleDateFormat simpleDateFormat = new SimpleDateFormat(partten);
 63         String str = simpleDateFormat.format(calendar.getTime());
 64         
 65         try {
 66             pageContext.getOut().write(str);
 67         } catch (IOException e) {
 68             // TODO Auto-generated catch block
 69             e.printStackTrace();
 70         }
 71         
 72         return super.doStartTag();
 73         
 74     }
 75     
 76     /**
 77      * 
 78      * 标签处理结束的调用的方法
 79      */
 80     @Override
 81     public int doEndTag() throws JspException {
 82         // TODO Auto-generated method stub
 83         return super.doEndTag();
 84     }
 85     
 86     
 87     /**
 88      * 
 89      * 释放资源
 90      */
 91     @Override
 92     public void release() {
 93         // TODO Auto-generated method stub
 94         super.release();
 95     }
 96     
 97     
 98     
 99     
100     
101     
102     
103     
104     /**
105      * 
106      * 测试主方法
107      * @param args
108      */
109     public static void main(String[] args) {
110         long a = 123456789123l;
111         long time = Long.valueOf(a);
112         Calendar calendar = Calendar.getInstance();
113         calendar.setTimeInMillis(time);
114         SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
115         System.out.println(simpleDateFormat.format(calendar.getTime()));
116     }
117     
118     
119     
120     
121     
122     
123 }
  1. LongDateTag
  2. 编写自定义标签的描述文件datetag.tld,将它放在WEB-INF下面,如下所示:
1 <?xml version="1.0" encoding="UTF-8" ?>
 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 
 4 <!-- 标签描述TLD文件 -->
 5 
 6 <taglib>
 7     <tlib-version>1.1</tlib-version>
 8     <jsp-version>1.2</jsp-version>
 9     
10     <!-- 默认前缀名 -->
11     <short-name>diy</short-name>
12     
13     <uri>http://www.mytaglib.com/taglib</uri> 
14     <display-name>MyDateTaglib</display-name>
15     <description>My date taglib!</description>  
16       
17     <tag>
18         <name>date</name>
19         <tag-class>com.tag.LongDateTag</tag-class>
20         
21         <attribute>
22             <name>value</name>
23             <!-- 属性是否必须 -->
24             <required>true</required>
25             <!-- 属性是否支持小脚本 EL表达式 -->
26             <rtexprvalue>true</rtexprvalue>
27         </attribute>
28         
29         <attribute>
30             <name>partten</name>
31             <!-- 属性是否必须 -->
32             <required>false</required>
33             <!-- 属性是否支持小脚本 EL表达式 -->
34             <rtexprvalue>true</rtexprvalue>
35         </attribute>
36         
37     </tag>
38     
39 </taglib>
  1. datetag
  2. 在web项目中的web.xml文件中声明自定义标签,如下所示:
1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xmlns="http://xmlns.jcp.org/xml/ns/javaee"
 4     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
 5     id="WebApp_ID" version="3.1">
 6     <display-name>test</display-name>
 7 
 8     <!-- 自定义JSTL时间格式化标签 -->
 9     <jsp-config>
10         <taglib>
11             <taglib-uri>http://www.mytaglib.com/taglib</taglib-uri>
12             <taglib-location>/WEB-INF/datetag.tld</taglib-location>
13         </taglib>
14     </jsp-config>
15 
16     <welcome-file-list>
17         <welcome-file>index.html</welcome-file>
18         <welcome-file>index.htm</welcome-file>
19         <welcome-file>index.jsp</welcome-file>
20         <welcome-file>default.html</welcome-file>
21         <welcome-file>default.htm</welcome-file>
22         <welcome-file>default.jsp</welcome-file>
23     </welcome-file-list>
24 </web-app>
  1. web.xml
  2. 在jsp页面中使用自定义标签,如下所示:                                                                                                    

1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
 4 
 5 <%@ taglib prefix="diy" uri="http://www.mytaglib.com/taglib" %>
 6 
 7 
 8 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 9 <html>
10 <head>
11 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
12 <title>Insert title here</title>
13 </head>
14 <body>
15     <diy:date value="123"></diy:date>
16 </body>
17 </html>
  1. index.jsp
  2. 启动服务,打开index界面,效果图,如下所示

    

android 自定义标签云 自定义标签开发步骤_Java

 

自定义标签的执行流程

 

  JSP引擎将遇到自定义标签时,首先创建标签处理器类的实例对象,然后按照JSP规范定义的通信规则依次调用它的方法。

  1. public void setPageContext(PageContext pc), JSP引擎实例化标签处理器后,将调用setPageContext方法将JSP页面的pageContext对象传递给标签处理器,标签处理器以后可以通过这个pageContext对象与JSP页面进行通信。
  2. public void setParent(Tag t),setPageContext方法执行完后,WEB容器接着调用的setParent方法将当前标签的父标签传递给当前标签处理器,如果当前标签没有父标签,则传递给setParent方法的参数值为null。
  3. public int doStartTag(),调用了setPageContext方法和setParent方法之后,WEB容器执行到自定义标签的开始标记时,就会调用标签处理器的doStartTag方法。
  4. public int doEndTag(),WEB容器执行完自定义标签的标签体后,就会接着去执行自定义标签的结束标记,此时,WEB容器会去调用标签处理器的doEndTag方法。
  5. public void release(),通常WEB容器执行完自定义标签后,标签处理器会驻留在内存中,为其它请求服务器,直至停止web应用时,web容器才会调用release方法。