JSP 自定义标签
自定义标签是用户定义的JSP语言元素。当JSP页面包含一个自定义标签时将被转化为servlet,标签转化为对被 称为tag handler的对象的操作,即当servlet执行时Web container调用那些操作。
JSP标签扩展可以让你创建新的标签并且可以直接插入到一个JSP页面。 JSP 2.0规范中引入Simple Tag Handlers来编写这些自定义标记。
你可以继承SimpleTagSupport类并重写的doTag()方法来开发一个最简单的自定义标签
开发步骤
接下来,将开发一个自定义标签,功能是将long类型的时间,转化成时间的字符串。
- 要创建自定义的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 } - 编写自定义标签的描述文件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> - 在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> - 在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> - 启动服务,打开index界面,效果图,如下所示
自定义标签的执行流程
JSP引擎将遇到自定义标签时,首先创建标签处理器类的实例对象,然后按照JSP规范定义的通信规则依次调用它的方法。
- public void setPageContext(PageContext pc), JSP引擎实例化标签处理器后,将调用setPageContext方法将JSP页面的pageContext对象传递给标签处理器,标签处理器以后可以通过这个pageContext对象与JSP页面进行通信。
- public void setParent(Tag t),setPageContext方法执行完后,WEB容器接着调用的setParent方法将当前标签的父标签传递给当前标签处理器,如果当前标签没有父标签,则传递给setParent方法的参数值为null。
- public int doStartTag(),调用了setPageContext方法和setParent方法之后,WEB容器执行到自定义标签的开始标记时,就会调用标签处理器的doStartTag方法。
- public int doEndTag(),WEB容器执行完自定义标签的标签体后,就会接着去执行自定义标签的结束标记,此时,WEB容器会去调用标签处理器的doEndTag方法。
- public void release(),通常WEB容器执行完自定义标签后,标签处理器会驻留在内存中,为其它请求服务器,直至停止web应用时,web容器才会调用release方法。