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編程語言。
本文內容包括:
如果你還不熟悉jsp,那么直接從jsp2.0入手是一個不錯的主意。但是如果希望學習jsp1.2,也許你需要從jsp教程開始學習。
jsp 2.0是對jsp 1.2的升級,增加了幾個有趣的新特性,可以使web應用程序設計人員和開發人員的工作更容易一些。jsp 2.0的目標是比以前更易于使用,更重要的是無須學習java語言本身就可以使用它。它增加了一種稱為simpletag的新擴展機制來簡化標簽api(tag api)。
除了其他一些改進外,jsp 2.0引入的最主要的新特性包括:
本文主要討論表達式語言、簡化的標簽api和標簽文件。相信目前的jsp開發人員將會發現這些重要的特性不但有趣,而且非常有用。
在java規格請求(jsr 152)中版本號最初定為1.3。但是正如你將在后面看到的那樣,由于這些新特性對jsp應用程序的開發模型產生了如此深刻的影響,專家組感到有必要把主版本號升級到2.0,這樣才能充分反映這種影響。此外,新的版本號也有助于把開發人員的注意力吸引到這些有趣的新特性上來。令人欣慰的是,所有合法的jsp1.2頁面同時也是合法的jsp2.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 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變量??梢允褂命c號(.)或方括號([])運算符從集合中檢索屬性值:
表達式語言統一了對點號和方括號運算符的處理,因此${ 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下。
你將看到類似圖1所示的畫面。使用表達式語言就這么簡單!
圖1:jsp表達式語言和隱含對象
注意: 在本文中,所有的jsp文件都保存在c:/tomcat5.0/webapps/jsp-examples/jsp2-tutorial目錄下。
隱含對象可用于讀取填充表單的數據。代碼示例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>
要運行這個例子:
如果一切正常,應該會看到類似如圖3所示的窗口。
圖3:使用函數
新聞熱點
疑難解答