【JSP】自定义标签开发入门

时间:2021-06-30 13:11:30

JSP 自定义标签

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

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

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

开发步骤

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

  1. 要创建自定义的JSP标签,你首先必须创建处理标签的Java类。所以,让我们创建一个LongDateTag类,如下所示:
    【JSP】自定义标签开发入门【JSP】自定义标签开发入门
      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下面,如下所示:
    【JSP】自定义标签开发入门【JSP】自定义标签开发入门
     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文件中声明自定义标签,如下所示:
    【JSP】自定义标签开发入门【JSP】自定义标签开发入门
     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页面中使用自定义标签,如下所示:                                                                                                    【JSP】自定义标签开发入门
  5. 【JSP】自定义标签开发入门【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

     

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

    【JSP】自定义标签开发入门

 

自定义标签的执行流程

 

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