H__D  

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 }
    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>
    datetag

     

  3. 在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>
    web.xml

     

  4. 在jsp页面中使用自定义标签,如下所示:                                                                                                    
  5.  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

     

  6. 启动服务,打开index界面,效果图,如下所示

    

 

自定义标签的执行流程

 

  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方法。
posted on 2016-07-03 16:52  H__D  阅读(1463)  评论(0编辑  收藏  举报