中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JSP中怎么自定義標簽

發布時間:2021-08-07 11:06:34 來源:億速云 閱讀:133 作者:Leah 欄目:編程語言

JSP中怎么自定義標簽,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

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

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

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

(2) 定義tld文件

<?xml version="1.0" encoding="UTF-8"?> <taglib>    <tlibversion>1.0</tlibversion>    <jspversion>1.1</jspversion>   <tag>     <name>displayDate</name>     <tagclass>cn.com.chenlly.tag.DateTagNoBody</tagclass>     <bodycontent>empty</bodycontent>   </tag>           </taglib>

(3) JSP頁面動態引用

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

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

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

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

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

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

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

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

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

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

import java.io.IOException;  import java.util.Date;  import javax.servlet.http.HttpServletRequest;  import javax.servlet.jsp.JspException;  import javax.servlet.jsp.JspWriter;  import javax.servlet.jsp.tagext.Tag;  import javax.servlet.jsp.tagext.TagSupport;  //無正文標簽類繼承的是TagSupport類 實現的接口是Tag。 如果有正文的標簽類繼承的是BodyTagSupport類 實現的接口是BodyTag  public class DateTagNoBody extends TagSupport {      private String pattern;   @Override   public int doStartTag() throws JspException {    HttpServletRequest request;    // 是TagSupport類中定義的一個屬性,它是javax.servlet.jsp.PageContext的對象    request = (HttpServletRequest) pageContext.getRequest();    java.text.SimpleDateFormat formater = new java.text.SimpleDateFormat(pattern);    String date = formater.format(new Date());    JspWriter out = pageContext.getOut();    try {     out.print(date);    } catch (IOException e) {     e.printStackTrace();    }    // doStartTag() 方法返回 SKIP_BODY 。當然其原因是我們的簡單日期標記沒有正文。    return Tag.SKIP_BODY;   }      //必須實現setXX()方法   public void setPattern(String pattern){    this.pattern = pattern;   }  }

(2) 定義tld文件

<?xml version="1.0" encoding="UTF-8"?>  <taglib>     <tlibversion>1.0</tlibversion>     <jspversion>1.1</jspversion>    <tag>      <name>displayDate</name>      <tagclass>cn.com.chenlly.tag.DateTagNoBody</tagclass>      <bodycontent>empty</bodycontent>      <!-- 定義屬性 -->      <attribute>         <name>pattern</name> <!-- 屬性名字 -->         <type>String</type>  <!-- 屬性類型 -->         <requried>false</requried> <!-- 是否必須 -->         <rtexprvale>false</rtexprvale> <!-- 表示是否可以使用JSP表達式  -->    </attribute>    </tag>  </taglib>

(3)JSP頁面動態引用

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

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

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

import java.io.IOException;  import java.util.Date;  import javax.servlet.http.HttpServletRequest;  import javax.servlet.jsp.JspException;  import javax.servlet.jsp.JspWriter;  import javax.servlet.jsp.tagext.BodyContent;  import javax.servlet.jsp.tagext.BodyTagSupport;   public class BodyTag extends BodyTagSupport {      private int count;    private HttpServletRequest reqeust;    private JspWriter out;       public void init() {    reqeust = (HttpServletRequest) pageContext.getRequest();    out = pageContext.getOut();   }    @Override   public int doStartTag() throws JspException {    init();    return this.EVAL_BODY_INCLUDE;   }      //設置當前標簽體   @Override   public void setBodyContent(BodyContent bodyContent) {    this.bodyContent = bodyContent;    System.out.println("setBodyContent...");    }      //需要初始化bodyContent   @Override   public void doInitBody() throws JspException {    System.out.println("init.....");   }      @Override   public int doAfterBody() throws JspException {    if (count >= 1) {     try {      out.println(count);      out.println("<Br>");     } catch (IOException e) {      e.printStackTrace();     }     count --;     return this.EVAL_BODY_AGAIN;    } else {     return this.SKIP_BODY;    }   }    @Override   public int doEndTag() throws JspException {    java.text.SimpleDateFormat formater = new java.text.SimpleDateFormat(      "yyyy-MM-dd");    String date = formater.format(new Date());    try {     out.print(date);    } catch (IOException e) {     e.printStackTrace();    }    return this.EVAL_PAGE;   }    // 必須實現setXX()方法   public void setCount(int count) {    this.count = count;   }  }

(2) 定義tld文件

<?xml version="1.0" encoding="UTF-8"?> <taglib>    <tlibversion>1.0</tlibversion>    <jspversion>1.1</jspversion>   <tag>     <name>iterator</name>     <tagclass>cn.com.chenlly.tag.BodyTag</tagclass>     <bodycontent>jsp</bodycontent>     <!-- 定義屬性 -->     <attribute>        <name>count</name> <!-- 屬性名字 -->        <type>int</type>  <!-- 屬性類型 -->        <requried>false</requried> <!-- 是否必須 -->        <rtexprvale>false</rtexprvale> <!-- 表示是否可以使用JSP表達式  -->   </attribute>   </tag> </taglib>

(3) jsp 頁面動態引用

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

效果圖:

JSP中怎么自定義標簽

執行順序

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則不執行此頁面的其它代碼。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

jsp
AI

盘锦市| 正定县| 民和| 平阴县| 名山县| 紫金县| 余干县| 龙胜| 札达县| 平顶山市| 德惠市| 彝良县| 拜泉县| 黄梅县| 冕宁县| 高台县| 新巴尔虎右旗| 临江市| 治县。| 海丰县| 牟定县| 九江县| 广昌县| 惠东县| 封开县| 夏津县| 周宁县| 新乡县| 绍兴市| 鄂温| 玛曲县| 长寿区| 高青县| 镇宁| 广南县| 长葛市| 塔城市| 惠东县| 彩票| 武隆县| 潼关县|