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方法。