国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

淺談JSP自定義標簽實現過程

開發 后端
本文將通過自定義標簽顯示日期為例,簡單談談JSP自定義標簽實現過程。包括沒有正文的JSP自定義標簽實現、沒有正文的但帶有屬性的JSP自定義標簽標簽實現等等內容。

(一) 沒有正文的JSP自定義標簽實現

(1):定義JSP自定義標簽處理類

  1. import java.io.IOException;  
  2. import java.util.Date;  
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.jsp.JspException;  
  5. import javax.servlet.jsp.JspWriter;  
  6. import javax.servlet.jsp.tagext.Tag;  
  7. import javax.servlet.jsp.tagext.TagSupport;  
  8. //無正文標簽類繼承的是TagSupport類 實現的接口是Tag。 如果有正文的標簽類繼承的是BodyTagSupport類 實現的接口是BodyTag  
  9. public class DateTagNoBody extends TagSupport {  
  10.  @Override  
  11.  public int doStartTag() throws JspException {  
  12.   HttpServletRequest request;  
  13.   // 是TagSupport類中定義的一個屬性,它是javax.servlet.jsp.PageContext的對象  
  14.   request = (HttpServletRequest) pageContext.getRequest();  
  15.   java.text.SimpleDateFormat formater = new java.text.SimpleDateFormat("yyyy-MM-dd");  
  16.   String date = formater.format(new Date());  
  17.   JspWriter out = pageContext.getOut();  
  18.   try {  
  19.    out.print(date);  
  20.   } catch (IOException e) {  
  21.    e.printStackTrace();  
  22.   }  
  23.   // doStartTag() 方法返回 SKIP_BODY 。當然其原因是我們的簡單日期標記沒有正文。  
  24.   return Tag.SKIP_BODY;  
  25.  }  

(2) 定義tld文件

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <taglib> 
  3.    <tlibversion>1.0</tlibversion> 
  4.    <jspversion>1.1</jspversion> 
  5.   <tag> 
  6.     <name>displayDate</name> 
  7.     <tagclass>cn.com.chenlly.tag.DateTagNoBody</tagclass> 
  8.     <bodycontent>empty</bodycontent> 
  9.   </tag>           
  10. </taglib> 

 (3) JSP頁面動態引用

  1. <%@ page language="java" pageEncoding="UTF-8"%> 
  2. <%@ taglib uri="/WEB-INF/datetag.tld" prefix="c"%> 
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
  4. <html> 
  5.   <head> 
  6.   </head> 
  7.   <body> 
  8.    <c:displayDate/> 
  9.   </body> 
  10. </html> 

注意:動態引用和靜態引用的區別。

為了進行靜態引用,首先必須將下面的項加入到web.xml 文件中:

  1. <?xml version="1.0" encoding="ISO-8859-1" ?> 
  2. <Web-app>         
  3.    <taglib> 
  4.       <taglib-uri>myTags</taglib-uri> 
  5.       <taglib-location>/WEB-INF/lib/DateTagLib.tld</taglib-location> 
  6.    </taglib>                 
  7. </Web-app> 

然后,將JSP 聲明加入到所有需要使用自定義標記庫的頁面中:

  1. <%@ taglib uri="myTags" prefix="c" %> 

指定的uri 屬性與在web.xml 文件中指定的taglib-uri 值相匹配。

在進行標記庫的靜態引用時,JSP 聲明必須查詢 web.xml 文件以執行庫查詢。這意味著如果移動或者重命名了庫,或者希望在 web.xml 文件中加入更多的庫,就必須停止服務器、更新 web.xml 文件、然后重新啟動服務器。動態方法讓JSP頁直接指向 TLD 位置,因而是在解釋JSP頁面時進行處理。

(二)  沒有正文的但帶有屬性的JSP自定義標簽標簽實現

 (1):定義JSP自定義標簽處理類

  1. import java.io.IOException;  
  2. import java.util.Date;  
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.jsp.JspException;  
  5. import javax.servlet.jsp.JspWriter;  
  6. import javax.servlet.jsp.tagext.Tag;  
  7. import javax.servlet.jsp.tagext.TagSupport;  
  8. //無正文標簽類繼承的是TagSupport類 實現的接口是Tag。 如果有正文的標簽類繼承的是BodyTagSupport類 實現的接口是BodyTag  
  9. public class DateTagNoBody extends TagSupport {  
  10.    
  11.  private String pattern;  
  12.  @Override  
  13.  public int doStartTag() throws JspException {  
  14.   HttpServletRequest request;  
  15.   // 是TagSupport類中定義的一個屬性,它是javax.servlet.jsp.PageContext的對象  
  16.   request = (HttpServletRequest) pageContext.getRequest();  
  17.   java.text.SimpleDateFormat formater = new java.text.SimpleDateFormat(pattern);  
  18.   String date = formater.format(new Date());  
  19.   JspWriter out = pageContext.getOut();  
  20.   try {  
  21.    out.print(date);  
  22.   } catch (IOException e) {  
  23.    e.printStackTrace();  
  24.   }  
  25.   // doStartTag() 方法返回 SKIP_BODY 。當然其原因是我們的簡單日期標記沒有正文。  
  26.   return Tag.SKIP_BODY;  
  27.  }  
  28.    
  29.  //必須實現setXX()方法  
  30.  public void setPattern(String pattern){  
  31.   this.pattern = pattern;  
  32.  }  

 (2) 定義tld文件

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <taglib>  
  3.    <tlibversion>1.0</tlibversion>  
  4.    <jspversion>1.1</jspversion>  
  5.   <tag>  
  6.     <name>displayDate</name>  
  7.     <tagclass>cn.com.chenlly.tag.DateTagNoBody</tagclass>  
  8.     <bodycontent>empty</bodycontent>  
  9.     <!-- 定義屬性 -->  
  10.     <attribute>  
  11.        <name>pattern</name> <!-- 屬性名字 -->  
  12.        <type>String</type>  <!-- 屬性類型 -->  
  13.        <requried>false</requried> <!-- 是否必須 -->  
  14.        <rtexprvale>false</rtexprvale> <!-- 表示是否可以使用JSP表達式  -->  
  15.   </attribute>  
  16.   </tag>  
  17. </taglib> 

 (3)JSP頁面動態引用

  1. <%@ page language="java" pageEncoding="UTF-8"%> 
  2. <%@ taglib uri="/WEB-INF/datetag.tld" prefix="c"%> 
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
  4. <html> 
  5.   <head> 
  6.   </head> 
  7.   <body> 
  8.    <c:displayDate pattern='yyyy-MM-dd'/> 
  9.    </br> 
  10.    <c:displayDate pattern='MM/dd HH:mm:ss'/> 
  11.   </body> 
  12. </html> 

 (三) 有正文的且帶有屬性的JSP自定義標簽實現

(1):定義JSP自定義標簽處理類

  1. import java.io.IOException;  
  2. import java.util.Date;  
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.jsp.JspException;  
  5. import javax.servlet.jsp.JspWriter;  
  6. import javax.servlet.jsp.tagext.BodyContent;  
  7. import javax.servlet.jsp.tagext.BodyTagSupport;  
  8.  
  9. public class BodyTag extends BodyTagSupport {  
  10.    
  11.  private int count;  
  12.  
  13.  private HttpServletRequest reqeust;  
  14.  
  15.  private JspWriter out;  
  16.  
  17.    
  18.  public void init() {  
  19.   reqeust = (HttpServletRequest) pageContext.getRequest();  
  20.   out = pageContext.getOut();  
  21.  }  
  22.  
  23.  @Override  
  24.  public int doStartTag() throws JspException {  
  25.   init();  
  26.   return this.EVAL_BODY_INCLUDE;  
  27.  }  
  28.    
  29.  //設置當前標簽體  
  30.  @Override  
  31.  public void setBodyContent(BodyContent bodyContent) {  
  32.   this.bodyContent = bodyContent;  
  33.   System.out.println("setBodyContent...");   
  34.  }  
  35.    
  36.  
  37. //需要初始化bodyContent  
  38.  @Override  
  39.  public void doInitBody() throws JspException {  
  40.   System.out.println("init.....");  
  41.  }   
  42.  
  43.  
  44.  @Override  
  45.  public int doAfterBody() throws JspException {  
  46.   if (count >= 1) {  
  47.    try {  
  48.     out.println(count);  
  49.     out.println("<Br>");  
  50.    } catch (IOException e) {  
  51.     e.printStackTrace();  
  52.    }  
  53.    count --;  
  54.    return this.EVAL_BODY_AGAIN;  
  55.   } else {  
  56.    return this.SKIP_BODY;  
  57.   }  
  58.  }  
  59.  
  60.  @Override  
  61.  public int doEndTag() throws JspException {  
  62.   java.text.SimpleDateFormat formater = new java.text.SimpleDateFormat(  
  63.     "yyyy-MM-dd");  
  64.   String date = formater.format(new Date());  
  65.   try {  
  66.    out.print(date);  
  67.   } catch (IOException e) {  
  68.    e.printStackTrace();  
  69.   }  
  70.   return this.EVAL_PAGE;  
  71.  }  
  72.  
  73.  // 必須實現setXX()方法  
  74.  public void setCount(int count) {  
  75.   this.count = count;  
  76.  }  

(2) 定義tld文件

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <taglib> 
  3.    <tlibversion>1.0</tlibversion> 
  4.    <jspversion>1.1</jspversion> 
  5.   <tag> 
  6.     <name>iterator</name> 
  7.     <tagclass>cn.com.chenlly.tag.BodyTag</tagclass> 
  8.     <bodycontent>jsp</bodycontent> 
  9.     <!-- 定義屬性 --> 
  10.     <attribute> 
  11.        <name>count</name> <!-- 屬性名字 --> 
  12.        <type>int</type>  <!-- 屬性類型 --> 
  13.        <requried>false</requried> <!-- 是否必須 --> 
  14.        <rtexprvale>false</rtexprvale> <!-- 表示是否可以使用JSP表達式  --> 
  15.   </attribute> 
  16.   </tag> 
  17. </taglib> 

(3) jsp 頁面動態引用

  1. <%@ page language="java" pageEncoding="UTF-8"%> 
  2. <%@ taglib uri="/WEB-INF/bodytag.tld" prefix="c"%> 
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
  4. <html> 
  5.   <head> 
  6.   </head> 
  7.   <body> 
  8.    <c:iterator count="10">HelloWorld!</c:iterator> 
  9.    <%  
  10.     out.println("Bye Bye");  
  11.     %> 
  12.   </body> 
  13. </html> 

效果圖:

執行順序

doStartTag()->setBodyContent()->doInitBody()->doAfterTag()->doEndTag()

如果doStartTag()返回的是EVAL_BODY_INCLUDE執行doAfterTag()方法,

如果它返回SKIP_BODY就執行doEndTag()方法。

setBodyContent()方法用于設置標簽體內容,如果在計算BodyContent時需要進行一些初始化工作,

則在doInitBody()方法中完成。標簽體內容執行完后,會調用doAfterBody()方法

在doAfterTag()方法中返回EVAL_BODY_AGAIN來重復執行doAfterTag()方法

返回SKIP_BODY值則執行doEndTag()方法。

在doEndTag()方法中返回EVAL_PAGE值,則執行此標簽的后的其它代碼,

返回SKIP_PAGE則不執行此頁面的其它代碼。

【編輯推薦】

  1. 在JSP中獲取數據庫連接
  2. 介紹JSP Action的使用
  3. 簡化JSP表達式中代碼
  4. 詳解JSP向Servlet轉換
  5. 簡單介紹JSP元素教程
責任編輯:彭凡 來源: CSDN
相關推薦

2012-02-02 13:45:28

JavaJSP

2009-07-06 16:59:26

JSP自定義標簽

2011-12-26 10:11:08

JSP

2009-07-02 15:31:49

JSP標簽

2009-06-30 10:40:25

JSP自定義標簽

2009-06-30 17:02:31

J2EE實現分頁

2009-07-02 11:25:33

JSP課程

2018-03-16 08:41:16

Oracle存儲函數

2009-09-07 22:00:15

LINQ自定義

2022-05-18 07:44:13

自定義菜單前端

2010-09-09 11:55:36

SQL函數標簽

2015-02-12 15:33:43

微信SDK

2015-07-29 10:31:16

Java緩存算法

2022-12-07 08:56:27

SpringMVC核心組件

2022-04-01 15:59:22

SQLPostgreSQL審計

2022-03-01 16:09:06

OpenHarmon鴻蒙單選組件

2013-01-09 17:22:38

Android開發Camera

2009-06-17 16:00:03

Hibernate自定

2009-09-03 13:34:03

.NET自定義控件

2023-01-03 07:40:27

自定義滑塊組件
點贊
收藏

51CTO技術棧公眾號

日本不卡一区| 国产精品免费看| 一区二区成人网| 成人激情视频小说免费下载| 日韩av一区在线观看| 韩国三级在线一区| 九九热hot精品视频在线播放| 天堂在线第六区| 欧美国产日韩激情| 久久涩涩网站| 亚洲黄色av网址| 天天插天天操天天射| 亚洲图片小说在线| 中文字幕中文字幕一区三区| 91免费欧美精品| 7777精品伊人久久久大香线蕉最新版| 国产在线日韩精品| 欧美男男freegayvideosroom| 日本蜜桃在线观看视频| 91caoporm在线视频| 在线观看免费国产小视频| 欧美成人免费高清视频| 5月婷婷6月丁香| 男人揉女人奶房视频60分| 欧妇女乱妇女乱视频| 女女同性女同一区二区三区按摩| 亚洲国产高清国产精品| 少妇熟女一区二区| www.男人天堂网| 北条麻妃在线视频观看| av网站在线不卡| 黄动漫在线免费观看| 国产福利小视频在线观看| 97电影在线观看| 麻豆网在线观看| 精品肉辣文txt下载| 麻豆一区在线| 人人狠狠综合久久亚洲婷| 欧美福利网址| 久久av一区二区三区| 国产一区在线精品| 欧美国产日产图区| 国产精品第四页| **性色生活片久久毛片| 日本韩国精品一区二区在线观看| 色综合久久精品| 欧美一区二区播放| 亚洲精品91美女久久久久久久| 999精品在线观看| 亚洲欧美一二三| 天海翼女教师无删减版电影| 超碰在线中文| 欧美网站免费观看| 国产精品99久久久久久大便| 很黄很黄激情成人| 中文在线最新版地址| 免费毛片小视频| 日韩美女写真福利在线观看| 欧美大片在线观看一区| 91在线视频网址| 91精品动漫在线观看| 免费av不卡在线观看| 日韩大片一区二区| 亚洲a在线观看| 亚洲欧美在线播放| 亚洲高清三级视频| 九九久久精品视频| 日韩国产欧美| 日韩av一卡| 国产.com| 亚洲午夜久久久影院伊人| 欧美重口另类videos人妖| 欧美日韩在线综合| 国产精品免费视频一区| 亚洲日本国产| 97人人做人人爽香蕉精品| 精品一二三四| 在线观看一区二区三区三州 | 亚洲成人免费网站| 国产无遮挡一区二区三区毛片日本 | 欧美人成在线| 欧美电影在线观看网站| 久久久久亚洲精品国产| 亚洲一区二区三区色| 午夜视频你懂的| 九九视频精品在线观看| 青青草精品视频在线观看| 国产911在线观看| 欧美精品尤物在线| 69久久夜色精品国产7777| 精品美女被调教视频大全网站| 国产 日韩 欧美大片| 欧美精品国产一区二区| 91精品入口| 青青草原国产在线| baoyu777.永久免费视频| 老汉色影院首页| 92国产精品视频| 91sa在线看| 欧美激情影音先锋| 91精品国产91久久久久久| 日韩中文字幕国产| 国产免费久久av| 超碰成人在线免费观看| 亚洲男人天堂色| 久久天堂电影| 蜜臀av免费观看| 欧美色综合一区二区三区| 精品美女在线视频| 日韩精品福利网| 中文字幕不卡一区| 亚洲精品久久久久中文字幕欢迎你 | 91亚洲国产| 在线成人小视频| 亚洲电影成人av99爱色| 色综合久久九月婷婷色综合| 欧美精品在线视频| 91精品国产综合久久久蜜臀粉嫩 | 99青草视频在线播放视| 国产成人福利网站| 成人在线激情网| 成人av电影观看| 亚洲精品三区| 日本一区二区在线不卡| 日产欧产美韩系列久久99| 国产另类在线| 国产成年精品| 亚洲妇女成熟| 亚洲小少妇裸体bbw| 天堂资源在线中文| 美女毛片在线看| 国产美女特级嫩嫩嫩bbb片| 91视频免费版污| 少妇人妻大乳在线视频| 午夜久久久久久久久久久| 亚洲欧美日本国产有色| 免费av一区二区三区| 成人激情av| 亚洲va男人天堂| 国产精品影院在线观看| 欧美又大粗又爽又黄大片视频| 91超碰中文字幕久久精品| 国模极品一区二区三区| 日韩av电影在线播放| 97精品视频在线播放| 欧美在线观看网址综合| 欧美精品制服第一页| 亚洲欧美成人在线| 国产亚洲aⅴaaaaaa毛片| 日韩成人在线电影网| 亚洲区免费影片| 国产丝袜一区二区三区| www.色综合| xxxx性欧美| 2019中文在线观看| 欧美乱大交xxxxx| 欧美一区二区三区爱爱| 欧美成人性福生活免费看| 精品久久久久香蕉网| 色婷婷亚洲婷婷| 亚洲精品乱码久久久久久蜜桃91 | 国产精品亚洲美女av网站| 九九精品视频在线观看| 8090成年在线看片午夜| 性色av一区二区三区免费| 国产激情综合五月久久| 国产精品视频久久久| 97碰碰视频| 亚洲黄在线观看| 成人免费一区二区三区牛牛| 久久综合国产精品| 精品国产综合久久| 香蕉视频在线看| 一区二区三区在线视频看| 久久久久久久久久国产| 久久久久久一区二区三区四区别墅| 国产精品久久久久7777按摩| 国产精品一区视频网站| 国产精品不卡视频| 亚洲日本成人在线观看| 亚洲va国产va欧美va观看| 亚洲综合在线一区| 国产日韩亚洲欧美综合| 美女三级99| 欧美精品日韩少妇| 日本h片在线观看| 玛雅亚洲电影| 九九视频精品全部免费播放| 久久久国产精品| 日韩电影在线观看电影| 成人小视频免费在线观看| 国产欧美日韩视频在线观看| 一区二区高清免费观看影视大全| 国产揄拍国内精品对白| 中文字幕日韩一区二区| 欧美日韩美女在线| 亚洲欧美国内爽妇网| 久久免费国产视频| 免费国产在线精品一区二区三区| 成人在线免费观看视频网站|