Servlet&JSP的那些事兒(二十四)

來源:互聯網
上載者:User

本篇我們討論標籤檔案(Tag Files)。之前我們在Servlet&JSP的那些事兒(十六)、Servlet&JSP的那些事兒(十六)兩篇中討論過了傳統標籤和簡單標籤的開發,需要使用java語言編寫標籤處理器類,標籤檔案允許jsp頁面編寫人員使用jsp文法來定製標籤,不需要瞭解java語言。本篇我們主要介紹如何標籤檔案來定製標籤。如果能和之前的兩篇結合起來,會更好的理解標籤檔案。

標籤檔案的文法

它的文法和jsp文法有點類似,在jsp頁面中可以使用的文法在標籤檔案中可以使用,不過有不同之處。

1)jsp頁面中的page指令在標籤檔案中不能使用,標籤檔案增加了tag指令、attribute指令和variable指令。
2)<jsp:invoke>和<jsp:doBody>兩個標準動作元素只能在標籤檔案中使用。

我們先看一個簡單的標籤檔案hello.tag。如下

<%@ tag pageEncoding="gb2312" %>這是一個標籤檔案

tag指令只能在標籤檔案中使用,用於取代jsp頁面中的page指令。

編寫的標籤檔案要在jsp頁面中使用,需要存放在指定位置。包括兩個地方:一是放在/WEB-INF/tags目錄或其子目錄下,容器會自動搜尋其中的.tag和.tagx檔案。二是放在JAR檔案的/META-INF/tags目錄或其子目錄下。

現在編寫一個jsp頁面測試一下。如下所示:

<%@ page contentType="text/html;charset=gb2312" %><%@taglib tagdir="/WEB-INF/tags" prefix="mytag"%><html><head><title></title></head><body><mytag:hello/></body></html>

註:在taglib指令中,屬性tagdir指定標籤檔案所在的路徑。

可以啟動tomcat,訪問該頁面。在瀏覽器網址欄輸入http://localhost:8080/TestTag/hello.jsp。運行結果如下:

我們在D:\apache-tomcat-7.0.33\work\Catalina\localhost\TestTag\org\apache\jsp\tag檔案夾下,可以找到一個webhello_tag.java檔案。內容如下:

/* * Generated by the Jasper component of Apache Tomcat * Version: Apache Tomcat/7.0.33 * Generated at: 2012-12-14 08:32:17 UTC * Note: The last modified time of this file was set to *       the last modified time of the source file after *       generation to assist with modification tracking. */package org.apache.jsp.tag;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.jsp.*;public final class webhello_tag    extends javax.servlet.jsp.tagext.SimpleTagSupport    implements org.apache.jasper.runtime.JspSourceDependent {  private static final javax.servlet.jsp.JspFactory _jspxFactory =          javax.servlet.jsp.JspFactory.getDefaultFactory();  private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;  private javax.servlet.jsp.JspContext jspContext;  private java.io.Writer _jspx_sout;  private javax.el.ExpressionFactory _el_expressionfactory;  private org.apache.tomcat.InstanceManager _jsp_instancemanager;  public void setJspContext(javax.servlet.jsp.JspContext ctx) {    super.setJspContext(ctx);    java.util.ArrayList _jspx_nested = null;    java.util.ArrayList _jspx_at_begin = null;    java.util.ArrayList _jspx_at_end = null;    this.jspContext = new org.apache.jasper.runtime.JspContextWrapper(ctx, _jspx_nested, _jspx_at_begin, _jspx_at_end, null);  }  public javax.servlet.jsp.JspContext getJspContext() {    return this.jspContext;  }  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {    return _jspx_dependants;  }  private void _jspInit(javax.servlet.ServletConfig config) {    _el_expressionfactory = _jspxFactory.getJspApplicationContext(config.getServletContext()).getExpressionFactory();    _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(config);  }  public void _jspDestroy() {  }  public void doTag() throws javax.servlet.jsp.JspException, java.io.IOException {    javax.servlet.jsp.PageContext _jspx_page_context = (javax.servlet.jsp.PageContext)jspContext;    javax.servlet.http.HttpServletRequest request = (javax.servlet.http.HttpServletRequest) _jspx_page_context.getRequest();    javax.servlet.http.HttpServletResponse response = (javax.servlet.http.HttpServletResponse) _jspx_page_context.getResponse();    javax.servlet.http.HttpSession session = _jspx_page_context.getSession();    javax.servlet.ServletContext application = _jspx_page_context.getServletContext();    javax.servlet.ServletConfig config = _jspx_page_context.getServletConfig();    javax.servlet.jsp.JspWriter out = jspContext.getOut();    _jspInit(config);    jspContext.getELContext().putContext(javax.servlet.jsp.JspContext.class,jspContext);    try {      out.write("\r\n");      out.write("這是一個標籤檔案");    } catch( java.lang.Throwable t ) {      if( t instanceof javax.servlet.jsp.SkipPageException )          throw (javax.servlet.jsp.SkipPageException) t;      if( t instanceof java.io.IOException )          throw (java.io.IOException) t;      if( t instanceof java.lang.IllegalStateException )          throw (java.lang.IllegalStateException) t;      if( t instanceof javax.servlet.jsp.JspException )          throw (javax.servlet.jsp.JspException) t;      throw new javax.servlet.jsp.JspException(t);    } finally {      jspContext.getELContext().putContext(javax.servlet.jsp.JspContext.class,super.getJspContext());      ((org.apache.jasper.runtime.JspContextWrapper) jspContext).syncEndTagFile();    }  }}

從代碼中可以看出,這個類繼承自javax.servlet.jsp.tagext.SimpleTagSupport類,也就是說,標籤檔案本質上就是簡單標籤。所以標籤檔案和簡單標籤本質上並沒有什麼不同。

標籤檔案的隱藏屬性
標 簽檔案可以使用隱藏屬性:request、response、jsContext、session、application、out、config,其中 jspContext隱含對象的類型為javax.servlet.jsp.JspContext,它用來管理所有範圍的變數,就相當於JSP頁面的 pageContext隱藏對象一樣

標籤檔案的指令

標籤檔案中可以使用的主要指令:taglib、include、attribute、variable。

<%@ tag display-name="" body-content="" dynamic-attributes="" small-icon="" large-icon="" description="" example=""language="" import="" pageEncoding="" isELIgnored="">

tag 指令如同JSP網頁的page指令,用來設定標籤檔案。display-name表示圖形化開發工具顯示<display-name>所指定 的名稱;body-content表示可能的值有三種,分別是empty、scriptless、tagdependent、empty。empty為標 簽中沒有主體內容,scriptlet為標籤中的主體內容EL、JSP動作元素,但不可以為JSP指令碼元素,tagdependent表示標籤中的主體內 容交由tag自己去處理,預設值為scriptless;dynamic-attributes表示設定標籤檔案動態屬性的名稱,當dynamic-
attributes設定時,將會產生一個Map類型的集合對象,用來存放屬性的名稱和值;small_icon表示在圖形化開發工具顯 示<small-icon>所指定的TLD相對路徑的小表徵圖,大小為16X16;large-icon表示在圖形化開發工具顯 示<large-icon>所指定的TLD相對路徑的大表徵圖,大小為32X32;description表示用來說明此標籤檔案的相關信 息;example表示用來增加更多的標籤使用說明,包括標籤應用時的範例;language、import、pageEncoding、
isELIgnored這些屬性與page指令相對應的屬性相同。

<%@ attribute name="" required="" fragment="" rtexprvalue="" type="" description=""%>

這 個指令用來設定自訂標籤的屬性。其中name表示屬性的名字;required表示是否為必要,預設為false;rtexprvalue表示屬性值是 否可以為run-time運算式。如為true,表示屬性可用動態方式來指定,如:<mytag:read num="${param.num}"/>,如為false,則一定要用靜態方式來指定屬性值;type表示這個屬性的類型,預設值為 java.lang.String;description用來說明此屬性的相關資訊。

<%@ variable name-given="" name-from-attribute="" alias="" variable-class="" declare="" scope="" desription="">

這 個指令用來設定標籤檔案的變數。其中name-given表示直接指定變數的名稱;name-from-attribute表示以自訂標籤的某個屬性值 為變數名稱;alias表示聲明一個局部範圍屬性,用來接收變數的值;variable-class表示變數的類名稱,預設值為 java.lang.String;declare表示此變數是否聲明預設值為true;scope表示此變數的範圍,範圍是:AT_BEGIN、 AT_END和NESTED,預設值為NESTED;description用來說明此變數的相關資訊。

<jsp:invoke>動作元素

該元素將JspFragment類型的屬性的執行結果輸出到JspWriter對象,或者儲存到指定的範圍變數中。

<jsp:invoke fragment="frag" var="resultString" varReader="resultReader" scope="scope" />

frament為必須的屬性,用於指定類型為JspFragment的屬性的名稱。var是可選屬性,指定一個範圍變數的名字,類型是string。該變數儲存了JspFragment對象執行的結果。屬性var和屬性varReader只能指定其一,如果兩者都沒指定,則JspFragment對象的執行結果輸出到當前的JspWriter對象中。varReader將JspFragment對象執行的結果儲存到Reader類型的變數中。scope用來指定變數的jsp範圍內。預設為page。

<jsp:doBody>動作元素

該標籤用於執列標籤體(JspFragment對象),將結果輸出到JspWriter對象,或者儲存到指定的範圍變數中。

轉載請註明出處:http://blog.csdn.net/iAm333

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.