利用JSP 2.0開發Web應用程式

來源:互聯網
上載者:User
利用JSP 2.0開發Web應用程式

作者:Qusay H. Mahmoud
2003年7月

JSP(JavaServer Pages)技術是對Servlet的進一步抽象,它由JCP(Java Community Process)開發,是用於產生動態內容的開放式的、可免費擷取的規範,也是J2EE(Java 2 Enterprise Edition)規範的重要組成部分。許多商業應用伺服器如BEA WebLogic、IBM WebSphere、Live Jrun和Orion都支援JSP技術。

從機票預訂系統、銀行系統到購物系統,Web上到處都在應用JSP技術。新發布的2.0版是對JSP1.2的升級,增加了一些有趣的新特性。JSP2的目標是使動態網頁的設計更加容易,而且無需學習Java程式設計語言。

本文內容包括: 提供具有豐富範例程式碼的教程來使你熟悉JSP2.0 介紹JSP2.0的新特性 提供利用JSP2.0開發應用程式的一些體會 給出了一些範例程式碼,對這些代碼稍加修改即可用於你自己的應用程式。

如果你還不熟悉JSP,那麼直接從JSP2.0入手是一個不錯的主意。但是如果希望學習JSP1.2,也許你需要從JSP教程開始學習。 JSP 2.0

JSP 2.0是對JSP 1.2的升級,增加了幾個有趣的新特性,可以使Web應用程式設計人員和開發人員的工作更容易一些。JSP 2.0的目標是比以前更便於使用,更重要的是無須學習Java語言本身就可以使用它。它增加了一種稱為SimpleTag的新擴充機制來簡化標籤API(Tag API)。

除了其他一些改進外,JSP 2.0引入的最主要的新特性包括: 一種簡單的運算式語言(EL),能夠用來容易地從JSP頁面訪問資料,這種運算式語言簡化了基於JSP的不含指令碼的應用程式的編寫,不需要使用Java Scriptlet或者Java運算式; 用於直接使用JSP技術來定義可重用的自訂行為的新文法,該文法使用.tag和.tagx檔案,這類檔案可由開發人員或者網頁作者編寫; 3XML文法得到了實質性的改進,增加了新的標準副檔名(.tagx用於標籤檔案,.jspx用於JSP檔案)。

本文主要討論運算式語言、簡化的標籤API和標籤檔案。相信目前的JSP開發人員將會發現這些重要的特性不但有趣,而且非常有用。 為何要從1.2跨越到2.0。

在Java規格請求(JSR 152)中版本號碼最初定為1.3。但是正如你將在後面看到的那樣,由於這些新特性對JSP應用程式的開發模型產生了如此深刻的影響,專家組感到有必要把主要版本號升級到2.0,這樣才能充分反映這種影響。此外,新的版本號碼也有助於把開發人員的注意力吸引到這些有趣的新特性上來。令人欣慰的是,所有合法的JSP1.2頁面同時也是合法的JSP2.0頁面JSP 2.0起步

在著手學習JSP 2.0之前,你需要一個支援JSP2.0和Java Servlet 2.4規範的JSP環境。幸運的是,Jakarta Tomcat 5.0(alpha測試版)支援新的JSP2.0和Servlet 2.4規範,可以從http://jakarta.apache.org/builds/jakarta-tomcat/release/v5.0.4-alpha/下載並安裝Tomcat 5.0。 JSP運算式語言

向JSP網頁傳遞資訊是通過JSP scoped屬性和請求參數完成的。專門為網頁作者量身定做的一種運算式語言(EL)把JSP scoped屬性提升為從商務邏輯向JSP頁面傳遞資訊的標準方式。但是要注意,儘管這種運算式語言是JSP的一個重要特性,它並不是一種通用的程式語言。它僅僅是一種資料訪問語言,可以方便地訪問和處理應用程式資料,而無需使用scriptlet或者請求時(request-time)運算式的值。

在JSP2.0之前,網頁作者只能使用運算式<%= aName %>訪問系統的值,比如下面的例子:

<someTags:aTag attribute="<%= pageContext.getAttribute("aName") %>">

或者使用自訂JavaBeans組件的值:

<%= aCustomer.getAddress().getCountry() %>

運算式語言允許網頁作者使用簡單的文法訪問對象。比如要訪問一個簡單變數,可以像下面這樣寫:

<someTags:aTag attribute="${aName}">

而訪問嵌套的JavaBeans屬性,則可以像下面這樣寫:

${aCustomer.address.country}

你可能會問,這不是JavaScript的文法嗎。完全正確。如果你使用過JavaScript,就會感到非常輕鬆,因為運算式語言正是借用了訪問結構化資料的JavaScript文法。

注意:運算式語言最初是作為JSP標準標籤庫(JSTL)1.0的一部分而開發的,JSTL是一種標準標籤庫,它提供對通用的、結構化的任務的支援,如迭代和條件、XML文檔處理、國際化和利用SQL訪問資料庫等。JSTL規範是由JSR 52專家組開發的。關於JSTL的介紹,請參見Faster Development with JSTL(使用JSTL加速開發). 訪問應用程式資料

可以使用點號運算子(.)訪問作為對象屬性的應用程式資料,也可使用方括弧運算子[‘name’]訪問命名的數組元素。

運算式${data}表示名為data的scoped變數。可以使用點號(.)或方括弧([])運算子從集合中檢索屬性值: 點號運算子用於訪問命名的屬性,比如運算式${customer.name}表示scoped變數customer的name屬性; 方括弧運算子可用於檢索命名的屬性,比如在${customer[“name”]}中。也可以通過${customers[0]}的形式來訪問集合customers中的第一項。

運算式語言統一了對點號和方括弧運算子的處理,因此${customer.name}與${customer[“name”]}是等價的。正如你看到的那樣,運算式必須使用${和}包圍起來。

EL的標識符求值方式是使用PageContext.findAttribute(String),把標識符作為一個屬性來尋找它的值。如果沒有找到該屬性,則返回null。 運算子

運算式語言支援算術運算子、關係運算子和邏輯運算子,以完成大多數的資料處理操作。此外,它還提供了一個用於測試一個對象是否為空白的特殊運算子。運算子如表1所示。你可以使用empty運算子判斷某個集合或字串是否為空白。比方說,只有當要求的具名引數param沒有給出時,運算式${empty param.name}才返回真。Empty運算子可以與“!”運算子一起使用,比如${!empty param.name}當要求的具名引數param存在時返回真。

表1:運算式語言運算子

運算子

說明

+

-

*

/ 或 div

% 或 mod

模(求餘)

== 或 =

等於

!= 或 !=

不等於

< 或 lt

小於

> 或 gt

大於

<= 或 le

小於等於

>= 或 ge

大於等於

&& 或 and

邏輯與

|| or or

邏輯或

! 或 not

邏輯非

empty

檢查是否為空白值

a ? b : c

條件運算子

隱含對象

除了運算子外,運算式語言還定義了一些隱含對象以支援網頁作者訪問需要的應用程式資料。運算式語言定義的隱含對象如表2所示,後面將給出使用這些隱含對象的一個例子。

表2:運算式語言中的隱含對象

隱含對象

內容

applicationScope

應用程式範圍內的scoped變數組成的集合

cookie

所有cookie組成的集合

header

HTTP要求標頭部,字串

headerValues

HTTP要求標頭部,字串集合

initParam

全部應用程式參數名組成的集合

pageContext

當前頁面的javax.servlet.jsp.PageContext對象

pageScope

頁面範圍內所有對象的集合

param

所有請求參數字串組成的集合

paramValues

所有作為字串集合的請求參數

requestScope

所有請求範圍的對象的集合

sessionScope

所有會話範圍的對象的集合

運算式語言的例子

如你所言,網頁作者無須學習Java也能夠使用這種運算式語言。範例程式碼1顯示了一些運算式的例子和隱含對象的使用。

程式碼範例1: ex1.jsp

要運行這個例子,請參照以下步驟,這裡我們假定Tomcat 5.0安裝在c:/tomcat5.0下。 切換目錄到 c:/Tomcat5.0/webapps/jsp-examples 建立新目錄,名字可以是任意的,比如jsp2-tutorial 切換到jsp2-tutorial 把ex1.jsp複製並儲存到該目錄下 啟動Tomcat 5伺服器:指向“開始”->“程式”->“Apache Tomcat 5.0”,單擊“Apache Tomcat 5.0”來啟動Tomcat 在瀏覽器中輸入http://localhost:8080/jsp-examples/jsp2-tutorial/ex1.jsp

你將看到類似圖1所示的畫面。使用運算式語言就這麼簡單。


圖1:JSP運算式語言和隱含對象

注意: 在本文中,所有的JSP檔案都儲存在c:/Tomcat5.0/webapps/jsp-examples/jsp2-tutorial目錄下。 填充表單例子

隱含對象$paran[var]可用於讀取填充表單的資料。程式碼範例2給出了一個簡單的表單,該表單提示使用者輸入一個名字。

程式碼範例2: form.jsp

<HTML>
<HEAD>
<TITLE>Form Content</TITLE>
</HEAD><BODY><H3>Fill-out-form</H3>
<P>
<FORM action="form.jsp" method="GET">
Name = <input type="text" name="name" value="${param['name']}">
<input type="submit" value="Submit Name"></FORM>
<P>
The Name is: ${param.name}
</BODY>
</HTML>

在本例中,當使用者輸入名字並單擊“提交”按鈕時,輸入的名字就會顯示同一頁面中的“The Name is:”字樣後面,如圖2所示。

同樣,運行這個例子只需要把form.jsp複製到c:/Tomcat5.0/webapps/jsp-examples/jsp2-tutorial下並用瀏覽器開啟它。


圖2:表單處理 定義和使用函數

運算式語言允許你定義可在運算式中調用的函數。函數必須作為public類中的public static方法編寫。函數一經定義,它的簽名(signature)就映射到標籤庫描述符(TLD)中。

為了說明函數的使用,我們舉一個簡單的例子,把兩個數相加。首先要編寫求兩數之和的Java方法代碼,如程式碼範例3所示,這裡定義了一個靜態方法,它接收兩個字串參數,把它們解析成整數並返回它們的和。

程式碼範例3: Compute.java

package jsp2.examples.el;
import java.util.*;
public class Compute {
public static int add(String x, String y) {
int a = 0;
int b = 0;
try {
a = Integer.parseInt(x);
b = Integer.parseInt(y);
}catch(Exception e) {}
return a + b;
}
}

用javac把這段代碼編譯成功後,下一步就要把函數的簽名映射到標籤庫。程式碼範例4說明了如何把add函數映射到包含函數實現和函數簽名的類。後面將說明把這段代碼添加到哪兒。

程式碼範例4: 函數描述符

    <function>
<description>add x and y</description>
<name>add</name>
<function-class>jsp2.examples.el.Compute
</function-class>
<function-signature>int
add(java.lang.String,java.lang.String)
</function-signature>
</function>

現在我們就可以編寫一個JSP頁面來使用這個函數。程式碼範例5是包含兩個欄位的一個表單,使用者輸入兩個數字並按下“求和”按鈕,就會調用上面的函數並把兩個數相加,結果在同一個頁面中顯示出來。

程式碼範例5: math.jsp

<%@ taglib prefix="my" 
uri="http://jakarta.apache.org/tomcat/jsp2-example-taglib %>
<HEAD>
<TITLE>Functions</TITLE>
</HEAD>
<BODY>
<H3>Add Numbers</H3>
<P>
<FORM action="math.jsp" method="GET">
X = <input type="text" name="x" value="${param["x"]}">
<BR>
Y = <input type="text" name="y" value="${param["y"]}">
<input type="submit" value="Add Numbers">
</FORM>
<P>
The sum is: ${my:add(param["x"],param["y"])}
</BODY>
</HTML>

要運行這個例子: 複製Compute.java並儲存到C:/Tomcat5.0/webapps/jsp-examples/WEB-INF/classes/jsp2/examples/el下; 使用javac編譯Compute.java; 編輯檔案C:/Tomcat5.0/webapps/jsp-examples/WEB-INF/jsp2/jsp2-example-taglib.tld,把程式碼範例4中的程式碼片段添加到檔案中最後一個</function>標籤之後,</taglib>標籤之前; 複製math.jsp並儲存到c:/Tomcat5.0/webapps/jsp-examples/jsp2-tutorial下; 用瀏覽器開啟該檔案。

如果一切正常,應該會看到類似如圖3所示的視窗。


圖3:使用函數 標籤處理器

JSP 1.2中傳統的標籤處理API由於允許標籤體中包含scriptlet而變得複雜,但是現在利用運算式語言可以編寫不含scriptlet的JSP網頁。最終,JSP 2.0引入了一種新的標籤擴充機制,稱為“簡單標籤擴充”,這種機制有兩種使用方式: Java開發人員可以定義實現介面javax.servlet.jsp.tagext.SimpleTag的類; 不懂Java的網頁編寫人員則可以使用標籤檔案。

首先來看第一種方式,程式碼範例6給出了一個簡單的標籤處理器,它的作用僅僅是列印“This is my first tag! ”。

程式碼範例6: HelloTag.java

package jsp2.examples.simpletag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;import java.io.IOException;
/**
* SimpleTag handler that prints "This is my first tag!"
*/
public class HelloTag extends SimpleTagSupport {
public void doTag() throws JspException, IOException {
getJspContext().getOut().write("This is my first tag!");
}
}

編譯成功後,下一步就要在TLD中定義一個標籤描述符,下面是標籤描述符的例子。

程式碼範例7: 標籤描述符

    <tag>
<description>Prints this is my first tag</description>
<name>hello</name>
<tag-class>jsp2.examples.simpletag.HelloTag</tag-class>
<body-content>empty</body-content>
</tag>

最後再編寫一個使用上述標籤的JSP分頁檔,見程式碼範例8。

程式碼範例8: helloworld.jsp

<%@ taglib prefix="mytag" uri="/WEB-INF/jsp2/jsp2-example-taglib.tld" %>
<HTML>
<HEAD>
<TITLE>Simple Tag Handler</TITLE>
</HEAD>
<BODY>
<H2>Simple Tag Handler</H2>
<P>
<B>My first tag prints</B>: <mytag:hello/>
</BODY>
</HTML>

要運行這個例子: 複製HelloTg.java並儲存到C:/Tomcat5.0/webapps/jsp-examples/WEB-INF/classes/jsp2/examples/simpletag下; 使用javac編譯HelloTag.java; 把程式碼範例7中的標籤描述符添加到檔案C:/Tomcat5.0/webapps/jsp-examples/WEB-INF/jsp2/jsp2-example-taglib.tld中的</taglib>之前; 複製helloworld.jsp並儲存到c:/Tomcat5.0/webapps/jsp-examples/jsp2-tutorial目錄中; 用瀏覽器開啟helloworld.jsp。

如果一切正常,應該會看到類似如圖4所示的畫面。


圖4:簡單標籤處理器 標籤檔案

使用簡單標籤擴充機制的另一種方法是通過標籤檔案。標籤檔案是一種資源檔,網頁作者可以利用它抽取一段JSP代碼,通過定製功能來實現代碼的複用。換句話說,標籤檔案允許JSP網頁作者使用JSP文法建立可複用的標籤庫。標籤檔案的副檔名必須是“.tag”。

為說明使用標籤檔案是多麼容易,考慮一下程式碼範例9。沒錯,這就是一個標籤檔案。

程式碼範例9: greetings.tag

Hello there. How are you doing?

一旦定義了標籤檔案,就可以在JSP網頁的編寫中使用這種定製的功能。比如程式碼範例10中的JSP網頁。

程式碼範例10: chat.jsp

<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>
<HTML>
<HEAD>
<TITLE>JSP 2.0 Examples - Hello World Using a Tag File</TITLE>
</HEAD>
<BODY>
<H2>Tag File Example</H2>
<P>
<B>The output of my first tag file is</B>: <tags:greetings/>
</BODY>
</HTML>

要運行這個例子: 複製標籤檔案greetings.tags並儲存在c:/Tomcat5.0/webapps/jsp-examples/WEB-INF/tags 目錄下; 複製JSP網頁檔案char.jsp並儲存在c:/Tomcat5.0/webapps/jsp-examples/jsp2-tutorial 目錄下; 用瀏覽器開啟chat.jsp檔案。

如果一切正常,應該會看到類似如圖5所示的視窗。


圖5:簡單的標籤檔案

注意: 重要的是要注意到這裡沒有為問候標籤編寫TLD,而是建立了一個標籤檔案並放在特殊的目錄中,然後用taglib指令匯入並直接使用它。 另一個標籤檔案的例子

標籤檔案可以作為模板使用。考慮程式碼範例11中的標籤檔案display.tag,這個例子是根據Tomcat 5.0中的面板的例子改寫的。指令attribute類似於TLD中的<attribute>元素,允許聲明自訂的動作屬性。

程式碼範例11: display.tag

<%@ attribute name="color" %>
<%@ attribute name="bgcolor" %>
<%@ attribute name="title" %>
<TABLE border="0" bgcolor="${color}"> <TR>
<TD><B>${title}</B></TD>
</TR>
<TR>
<TD bgcolor="${bgcolor}">
<jsp:doBody/>
</TD>
</TR>
</TABLE>

程式碼範例12給出了使用上述標籤的一個簡單的JSP頁面。

程式碼範例12: newsportal.jsp

<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>
<HTML>
<HEAD>
<TITLE>Another Tag File Example</TITLE>
</HEAD>
<BODY>
<H2>News Portal: Another Tag File Example</H2>
<TABLE border="0"> <TR valign="top">
<TD>
<tags:display color="#ff0000" bgcolor="#ffc0c0"
title="Travel">
Last French Concorde Arrives in NY<br/>
Another Travel Headline<br/>
Yet Another Travel Headline<br/>
</tags:display>
</TD>
<TD>
<tags:display color="#00fc00" bgcolor="#c0ffc0"
title="Technology">
Java for in-flight entertainment<BR>
Another Technology Headline<BR>
Another Technology Headline<BR>
</tags:display>
</TD>
<TD>
<tags:display color="#ffcc11" bgcolor="#ffffcc"
title="Sports">
American Football<BR/>
NBA<BR/>
Soccer<BR/>
</tags:display>
</TD>
</TR>
</TABLE>
</BODY>
</HTML>

要運行這個例子: 複製檔案display.tag並儲存在c:/Tomcat5.0/webapps/jsp-examples/WEB-INF/tag 下; 複製檔案newsportal.jsp並儲存到c:/Tomcat5.0/webapps/jsp-examples/jsp2-tutorial下; 用瀏覽器開啟newsportal檔案。

結果應該會得到與圖6類似的畫面。


圖6:把標籤檔案用作模板 結論

JSP 2.0使得快速開發和維護動態網頁比以前更加容易,儘管“Java”一詞出現在JSP中,但使用JSP2.0,網頁作者無須學習Java程式語言本身,就能開發出全新的動態網頁。本文中的例子說明了使用JSP2.0的新特性開發動態網頁是多麼容易。 更多資訊 Fast Track JSP 1.2 JavaServer Pages Technology JavaServer Pages Specification (JSR 152) The Tomcat 5 Servlet/JSP Container JSP Developers Forum JavaServer Pages Standard Tag Library (JSTL)

Faster Development with JavaServer Pages Standard Tag Library (JSTL 1.0)
致謝

特別感謝Sun Microsystems公司的Gregory Murry和Mark Roth,他們的反饋協助我改進了這篇文章。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.