Servlet&JSP的那些事兒(十五)

來源:互聯網
上載者:User

先介紹一些瑣碎的概念。

javascript與JSP/Servlet

常用的動態網頁技術有CGI(Common Gateway Interface),PHP(Hypertext Preprocessor),ASP(Active Server Pages)和Servlet/JSP(Java Server Pages)。未經伺服器端程式處理的純html屬於靜態網頁。在介紹javascript的書中,常常將javascript定義為動態網頁的範疇,實際上html中的javascript代碼會被瀏覽器執行,而不是被伺服器端程式執行。javascript其實和java沒有關係。javascript用於與瀏覽器溝通,操作瀏覽器中的網頁畫面與行為,也可以通過javascript要求瀏覽器發送請求給伺服器。

所以javascript與servlet/jsp不能直接互動,必須通過HTTP來進行互動,資料交換或請求,響應。伺服器會將jsp網頁中內嵌的javascript代碼原封不動的返回給瀏覽器,由瀏覽器執行。對於處理jsp內容的伺服器而言,內嵌的javascript跟靜態html標籤沒有任何區別。

JavaEE

Java EE(Java Platform, Enterprise Edition)。與此對應的還有JavaSE(Java Platform, Standard Edition),JavaME(Java Platform, Micro Edition)。無論是Java EE,Java SE,Java ME,都是業界共同制定的標準,業界代表可參與JCP(Java Community Process)共同參與,審核,投票決定平台應有的組件,特性,API等,所制定出來的標準以JSR(Java Specification
Requests)作為正式標準規範檔案,不同的技術解決方案標準規範會給一個編號。在JSR規範的標準下,各個廠商可以各自實現成品,所以同樣是web容器,會有不同的廠商的實現產品,而JSR通常也會提供參考實現。

現在我們來繼續討論標籤庫(Tag library),這也是本篇的主要內容。使用它可以讓我們定義自己標籤,我們在Servlet&JSP的那些事兒(十)中討論了jsp的動作元素,其實動作元素本質上就是一段java代碼,在jsp頁面被轉換為servlet時,jsp容器遇到動作元素標籤,就會用預先定義的相對應的java代碼替代它。自訂標籤實際上也是一個實現了特定介面的java類。

標籤庫API 

標籤庫API存在定義在javax.servlet.jsp.tagex包中。其中主要的介面和類1所示。

圖1 標籤庫中主要的介面及類的繼承實現關係

自訂標籤和其他已有標籤一樣,有四種形式。

空標籤<hello />
帶有屬性的標籤<max attr1="attr1" attr2="attr2" />
帶有內容的標籤<greeting> hello </greeting>
帶有內容和屬性的標籤<greeting name="shan">hello</greeting>

Tag介面

javax.servlet.jsp.tagext.Tag介面定義了所有傳統的標籤處理器所要實現的基本方法。包括setPageContext()、setParent()、getParent()等。實現了Tag介面的標籤處理器的生命週期如下:

1)容器建立標籤處理器執行個體以後,調用setPageContext()方法設定標籤的上下文,然後調用setParent()設定標籤的父標籤,如果沒有,置為null。
2)調用標籤處理器的setXXX()方法,設定標籤屬性(沒有屬性,直接跳過)
3)調用doStartTag()方法,返回一個EVAL_BODY_INCLUDE或SKIP_BODY。如果返回前者,則將標籤輸出到當前的輸出資料流,如果返回後者,忽略標籤體。
4)調用doEndTag()方法,返回EVAL_PAGE或SKIP_PAGE,搶著表示執行jsp頁面剩餘部分,後者表示省略jsp頁面剩餘部分。
5)容器會緩衝標籤處理器執行個體,一旦遇到同樣的標籤,重複使用緩衝的標籤處理器執行個體
6)當需要釋放標籤處理器執行個體時,調用release()方法釋放。

IterationTag介面

javax.servlet.jsp.tagext.IterationTag介面繼承自Tag介面,它新增了一個方法和一個用作傳回值的常量,用於控制對標籤體的重複處理。實現了該介面的標籤處理器的聲明周期如下:

前三步和實現Tag介面的標籤處理器相同
4)指定完標籤體後,doAfterBody()方法被調用,該方法返回EVAL_BODY_AGAIN或SKIP_BODY。返回前者表示重複執列標籤體,返回後者表示不再執列標籤體。要注意,在執行該方法前,標籤體已經被執行了一遍。如果想忽略標籤體,需要在doStartTag()方法中返回SKIP_BODY。
後三步和實現Tag介面的標籤處理器最後三步相同。

BodyTag 介面

javax.servlet.jsp.tagext.BodyTag介面繼承自IterationTag介面,它又新增了兩個方法和一個用作傳回值的常量。實現了該介面的標籤處理器的生命週期如下:

前3步和實現了IterationTag介面的標籤處理器相同
4)調用setBodyContent()方法設定標籤處理器的bodyContent屬性,接著調用doInitBody()方法,為標籤體執行做準備。
後四步和實現了IterationTag介面的標籤處理器最後四步相同。

標籤庫描述符

編寫好標籤處理器類以後,為了使用標籤,還需要在標籤庫描述符檔案中配置標籤的相關資訊。標籤庫描述符(Tag Library Descriptor,TLD)是一個xml文檔。標籤庫描述符檔案使用的副檔名是“.tld”。當標籤庫部署在jar檔案中時,標籤庫描述符檔案必須放在META-INF目錄或其子目錄下。當標籤庫直接部署在web應用程式中時,標籤庫描述符檔案必須放在WEB-INF目錄或其子目錄下,但不能放在WEB-INF\classes或WEB-INF\lib目錄下。

<taglib>元素是標籤庫描述符的根項目,它包含13個子項目,具體內容如下:

(1)<description>:標籤庫的一個文本描述。
(2)<tlib-version>:指定標籤庫的版本。
(3)<short-name>:為標籤定義簡短的名字,在taglib指令中可作為首選的首碼名使用。
(4)<uri>:定義一個URI,用於唯一地標識此標籤庫。
(5)<tag>:用於指定自訂標籤的相關資訊。
(6)<display-name>:為標籤庫指定一個簡短的別名。
(7)<small-icon>:為標籤庫指定大小為16×16的小表徵圖(gif或jpeg格式),該表徵圖可在圖形介面工具中顯示。
(8)<large-icon>:為標籤庫指定大小為32×32的大表徵圖(gif或jpeg格式),該表徵圖可在圖形介面工具中顯示。
(9)<validator>:為標籤庫提供一個驗證器。
(10)<listener>:為標籤庫提供一個監聽器。
(11)<tag-file>:用於描述標籤檔案。
(12)<function>:用於指定在運算式語言中使用的函數。
(13)<taglib-extension>包含一個或多個<extension-element>元素,用於提供標籤庫的擴充資訊。

自訂標籤庫的內容如上所述。現在我們通過一些執行個體來加深理解。

建立一個工程TestTag,建立方法如前面所述。

我們定製一個<hello>標籤,用於向使用者輸出歡迎資訊。首先編寫標籤處理器類,代碼如下:

package com.shan.tag;import java.io.*;import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;public class HelloTag implements Tag {private PageContext pageContext;private Tag parent;public void setPageContext(PageContext pc) {this.pageContext = pc;}public void setParent(Tag t) {this.parent = t;}public Tag getParent() {return parent;}public int doStartTag() throws JspException {return SKIP_BODY;}public int doEndTag() throws JspException {//利用pageContext對象的getOut()方法得到JspWriter對象JspWriter out = pageContext.getOut();try {//利用JspWriter對象,向用戶端發送歡迎訊息out.println("Welcome to Tag's world!");} catch(IOException e) {System.out.println(e.toString());}return EVAL_PAGE;}public void release() {}}

然後在dos環境下切換到工程目錄,執行如下語句,編譯TestTag.java檔案。

javac -classpath D:\apache-tomcat-7.0.33\lib\jsp-api.jar;classes -d classes src\com\shan\tag\HelloTag.java

編譯完成後,在工程目錄下的classes\com\shan\tag檔案夾下會產生對應的.class檔案。

在tld檔案中配置<hello>標籤

建立檔案MyTaglib.tld檔案,內容如下:

<?xml version="1.0" encoding="ISO-8859-1" ?><!DOCTYPE taglib        PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"        "http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd"><taglib>  <tlib-version>1.0</tlib-version>  <jsp-version>1.2</jsp-version>  <short-name>mytag</short-name>  <display-name>MyTag</display-name>  <description>My Tag library.</description>  <tag>    <name>hello</name>    <tag-class>com.shan.tag.HelloTag</tag-class>    <description> Display JSP sources </description>    <body-content>empty</body-content>  </tag></taglib>

編輯web.xml檔案。內容如下:

<?xml version='1.0' encoding='utf-8'?><web-app xmlns="http://java.sun.com/xml/ns/javaee"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"  version="3.0"  metadata-complete="true"><jsp-config><taglib><taglib-uri>/mytag</taglib-uri><taglib-location>/WEB-INF/MyTaglib.tld</taglib-location></taglib></jsp-config></web-app>

編寫一個測試頁面test.jsp,內容如下:

<%@ page contentType="text/html;charset=gb2312" %><%@taglib uri="/mytag" prefix="mytag"%><html><head><title><mytag:hello/></title></head><body><mytag:hello/></body></html>

在tomcat安裝資料夾下的webapps目錄下建立TestTag目錄,在其中建立WEB-INF檔案夾,將剛編譯過的classes目錄和MyTaglib.tld檔案,web.xml檔案拷貝到WEB-INF檔案夾下,將test.jsp檔案拷貝的TestTag目錄下。開啟tomcat伺服器,在網址欄輸入localhost:8080\TestTag\test.jsp,運行結果所示:

轉載請註明出處: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.