zoukankan      html  css  js  c++  java
  • 【JSP】自定义标签开发入门

    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方法。
  • 相关阅读:
    Node buffer模块缓冲区
    Node url模块
    Node querystring
    Node fs模块同步读取写入追加
    Linux Shell 量的自增
    Compare, sort, and delete duplicate lines in Notepad ++
    PL SQL 基础
    Oracle alter table modify column Syntax example
    Oracle to_char格式化函数
    oracle to_char FM099999
  • 原文地址:https://www.cnblogs.com/h--d/p/5638299.html
Copyright © 2011-2022 走看看