JavaServer Pages (JSP)是基於Java的技術,用於創建可支持跨平台及跨Web服務器的動態網頁。
JSP可與微軟的Active Server Pages (ASP)相媲美,但JSP使用的是類似於HTML的標記和Java 代碼片段而不是用VBScript。當你使用不提供ASP本地支持的Web服務器(例如 Apache或Netscape服務器)時,你就可以考慮使用JSP了。你雖然也可以為這些服務器弄一個ASP附加軟件模塊,但是太昂貴了。現在Sun公司並不會因你使用JSP向你收費(雖然將來可能要收),況且用於Solaris、 Linux以及Windows系統的組件都很容易獲得。
不要把JSP與服務器端的JavaScript語言搞混了。Web服務器自動將通過JSP生成的Java代碼片段轉換成Java 片段(servlets)。 JSP也可自動控制許多功能,如過去用Perl腳本編寫功能程序或像ASP這樣的服務器專用API(應用編程接口)。
我們馬上就要開始幫助你建立一個使用JSP 技術的網站范例了。
准備好計算機以使用JSP
你需要Java2軟件開發工具箱(J2SDK),過去稱之為Java開發工具箱(JDK)、JavaServer 網絡開發工具箱(JSWDK)、Tomcat,或者其它能支持JSP的Web服務器。升陽公司為Windows、Solaris以及 Linux平台提供免費的J2SDK和JSWDK。
如果你想在現有的Web服務器上使用JSP,而此服務器本身不支持JSP和Java 代碼片段,可以試用Allaire公司的Jrun。它可以為Netscape的Enterprise Server和Fasttrack Server、微軟的Internet Information Server(IIS)和Personal Web Server(PWS)、Apache以及其他服務器充當Web服務器附件。你也可以使用Apache服務器的Java版,其中包含最新的JSWDK。
下載並安裝所需的軟件
目前,版本號為1.2.2-001的J2SDK可下載版以可安裝的歸檔文件形式出現。這個大約20MB的下載量軟件可提供一個徹底的Java開發環境,讓你創造任何基於Java並且利用了而標准核心API的解決方案。其實,你的Web服務器使用JSP的唯一條件是要有Java編輯器。要讓Web服務器知道編輯器的位置,需要JAVA_HOME 環境變量設置為J2SDK安裝目錄。如果你已經在Windows系統中進行了安裝並且接受了默認目錄, 請將“set JAVA_HOME=C:1.2.2”添加到你的“autoexec.bat”文件中,然後重新啟動。
安裝J2SDK後,下載並安裝JSWDK或者是Tomcat β版,即基於Java的Apache Web服務器的β版。你把JSWDK放在什麼地方是無關緊要的,只要你以後能找到它就行。通常,將其放在頂層目錄中,這樣你在替換JSWDK或JSDK時無需刪除另一個軟件。安裝好這個文件後,准備工作已經就緒,你可以開始JSP開發工作了。
正確地安裝JSWDK後,請運行“startserver”腳本程序,以啟動Web服務器,使其按照默認情況監聽8080端口。你要在啟動服務器之後查看您是否已正確地安裝了此工具,請加載一個JSP樣本文件(http://locahost:8080/examples/jsp/)。如果你能成功地運行這些樣本文件,說明你已經正確地安裝了這個軟件。如果你在用來啟動服務器的控制台窗口中看到報錯信息,你就需要做些修改。最經常發生的問題是沒有設置或不正確地設置了JAVA_HOME環境變量。要看到當前環境變量設置情況,要請在DOS提示符下鍵入“set”設置。
開始
在解釋 JSP語法前,創建一個快捷網頁,顯示目當前的日期和時間,並然後將之其保存為sample.jsp:
<html>
<head>
<title>First Page</title>
</head>
<body>
<H3>Today is:
<%= new java.util.Date() %>
</H3>
</body>
</html>.
把這個文件以及你所有的HTML 和 JSP 頁面放在JSWDK安裝目錄下的網頁目錄裡。你可以從http://localhost:8080/sample.jsp加載此網頁。該網頁首次被訪問時,Web服務器會把JSP編譯成Java代碼片段,這樣你就能夠看到當前的日期和時間了。
你已經下載、安裝並配置好了開發環境,你可以開始學習JSP語法並創建自己的基於JSP的解決方案了。
JSP基本語法
講完安裝問題後,現在進入來討論JSP語法。一個投機取巧的辦法是下載語法卡片。如果你不熟悉Java編程,也許你想看一下Sun的指南 。然而網頁創建者並不需要進行太多的Java開發。除了一些方法調用,在你的JSP網頁裡應盡可能少用Java代碼。
記住以上提示,我們首先來看一看JSP指令和腳本元素,之後我們會解釋JavaBeans和隱含對象。共有五種JSP指令和腳本元素。在JSP 1.0版中,大部分JSP被一個以“<%” 開頭和以“%>”結尾的的標記括在其中。在更新的JSP 1.1規范出台後,就有了與XML兼容的版本。
JSP指令和腳本元素
Directives <%@ directive %>
Declarations <%! declaration %>
Expressions <%= expression %>
Code Fragment/Scriptlet <% code fragment %>
Comments <%-- comment --%>
指令
JSP指令是為JSP引擎而設計的。他們並不直接產生任何可見輸出,而只是告訴引擎如何處理其余JSP頁面。這些指令始終被括在 “<%@ ?%>”標記中。兩個最重要的指令是“pagePage”和“Include”。“Taglib”指令不在討論之列,但是在用JSP1.1創建自定義標記可以使用它。
幾乎在所有JSP頁面頂部都會看到“Page”指令。盡管不是必須的,但它可以讓你指定:
到何處查找起支持作用的Java類別:
<%@ page import="java.util.Date" %>,
出現Java運行問題時,將網上沖浪者引向何處:
<%@ page errorPage="errorPage.jsp" %>,
還有你是否需要管理用戶的會話級信息,這些信息可能來自多個網頁(在下面的JavaBeans一節將對此做進一步講)述:
<%@ page session="true" %>.
“Include”指令可以把你的內容分成更多可管理的元素,比如包括一個普通頁面頁眉或頁腳的元素。包含的網頁可以是一個固定的HTML 頁面或更多的JSP內容:
<%@ include file="filename.jsp" %>
聲明
JSP聲明用來讓你定義頁面級變量,以保存信息或定義JSP頁面的其余部分可能需要的支持方法。如果你發現代碼太多,通常最好把它們寫成一個獨立的Java類別。聲明一般都在“<%! ?%>”標記中。一定要以分號(;)結束變量聲明,因為任何內容都必須是有效的Java語句:
<%! int i=0; %>。
表達式
有了JSP表達式,表達式評估結果會被轉換成一個字符串,並且被直接包括在輸出頁面之內。JSP 表達式包含在“<%= ?%>” 標記中,沒有分號,除非在加引號的字符串部分使用分號。
<%= i %>
<%= "Hello" %> .
代碼片段/腳本片段
代碼片段/腳本片段(Scriptlets) JSP代碼片段或腳本片段是嵌在“<% ?%>”標記中的。這種Java代碼在Web服務器響應請求時就會運行。在腳本片段周圍可能是原始的HTML或XML語句,在這些地方,代碼片段可以使你創建條件執行代碼,或要用到另外一段代碼的代碼。例如,以下的代碼組合使用表達式和代碼片段,顯示H1、H2、H3和H4標記中的字符串“Hello”。代碼片段並不局限於一行源代碼:
<% for (int i=1; i<=4; i++) { %>
<H<%=i%>>Hello</H<%=i%>>
<% } %>.
注釋
最後一個主要的JSP元素是嵌入式注釋。盡管你始終可以在文件中加入HTML注釋,但用戶在查看頁面源代碼時會看到這些注釋。如果你不想讓用戶看到它,你就應該將其嵌入“<%-- ?--%>” 標記中:
<%-- comment for server side only --%>.
帶JavaBean 的JSP
雖然你可以把大段的代碼放在腳本片段(scriptlet)內,但是絕大多數的Java代碼屬於可重復使用的名為JavaBea的組件。JavaBean類似於ActiveX控件:他們都能提供常用功能並且可以重復使用。
JavaBean的值是通過一些屬性獲得的,你可通過這些屬性訪問JavaBean設置。以一個人來打比方,這個人就是一個JavaBean,這個人的名字、身份證號碼以及住址就是其屬性。在JSP網站,你基本上就是通過玩“Connect the beans)”來使你的網站動態化。
假設JavaBean先於網站被創建出來,你需要做的第一件事就是告訴JSP頁面它將要用到一個“Bean”。你可以用“<jsp:useBean>”標記來做到這一點:
<jsp:useBean id="localName" class="com.jguru.Person" scope="application" />。
“<jsp:useBean>”標記要求你用“id”屬性來識鑒別Bean。這裡你提供一個名字來JSP頁面其余部分的Bean。除了“id”屬性,你還須告訴網頁面從何處查找Bean,或者它的Java類別名是什麼。這種類別屬性提供確 認Bean的功能,其他一些方法也可以做到這一點。最後一個必需的元素是“scope”屬性。有了“scope”屬性的幫助,你就能告訴Bean為單一頁面(默認情況)[scope="page"]、為[scope="request"]請求為會話[scope="session"],或者為整個應用程序[scope="application"]保持留信息。有了會話范圍,你就能非常容易地在JSP網頁面上維護購物車等項目。
一旦你聲名了一個JavaBean,你就可以訪問它的屬性來定制它。要獲得屬性值,請用“<jsp:getProperty>”標記。有了這個標記,你就能指定將要用到的Bean名稱(從useBean的"id"字段得到)以及你想得到其值的屬性。實際的值被放在輸出中:
<jsp:getProperty id="localName" property="name" />。
要改變JavaBean屬性,你必須使用“<jsp:setProperty>”標記。對這個標記,你需要再次識別Bean和屬性,以修改並額外提供新值。如果命名正確,這些值可以從一個已提交的表中直接獲得:參數獲得:
<jsp:setProperty id="localName" property="*" />;
可以從一個參數獲得,但你必須直接命名屬性和參數:
<jsp:setProperty id="localName" property="serialNumber" value="string" />
或者直接用一個名字稱和值來設置: <jsp:setProperty id="localName" property="serialNumber" value= <%= expression %> />.
關於JavaBean 的最後一件事: 為了Web服務器能找到JavaBean,你需要將其類別文件放在一個特殊位置。用JSWDK,最 方便的位置是安裝目錄下的類別目錄,如jswdk-1.0.1classes。
JSP隱含對象
與JSP語法相關的最後的元素是一些叫做“隱含對象”的東西。在JSP代碼片段中,你可以利用這些隱含對象與JSP頁面的代碼片段執行環境產生互動。應盡量少訪問這些內置隱含對象。但是,在一某些情況下,訪問隱含對象是可被接受的。若要充分利用隱含對象,就需了解最新的Java Servlet API。
下表列出可用的隱含對象集合。
隱含對象說明
request 客戶端請求,包括從GET/POST請求傳遞過來的參數
response 網頁傳回客戶端的反應
pageContext 在此管理網頁屬性
session 與請求關聯的會話
application 代碼片段的運行環境
out 傳送響應的輸出流
config 代碼片段配置對象
page JSP網頁本身
exception 有錯的網頁中未被捕獲的例外
這些都是用來做什麼的,你又如何來使用它們呢?基本上說,在你的腳本片段裡,你可以用它們進入執行JSP代碼的代碼片段。用不著深入了解太多的Servlet API細節,我們來看看能用它們來做到的某些事情:
你可以不用表達式,直接進入“Out”隱含對象,將某些內容輸出到響應中:
<% out.println("Hello"); %>。
用不著把一個參數直接送到JavaBean,你可以從請求對象獲取參數值:
<% String name=request.getParameter("name"); out.println(name); %>.
在你用JSP進行開發的過程中,進行更多的開發的過程中,如果創建了JavaBeans或發現JSP文件中加入了太多的Java源代碼,你就需要創建起支持作用的Java分類(class)了,它可以協助你重復利用源代碼並減少JSP網頁編譯時間。當你需要創建Java分類文件時,你必須:
將JDSWK installationin目錄添加到PATH中。在autoexec.bat文件PATH行的末尾,加入“C:1.2.2/bin”。
用這個命令將JAR文件復制到“jrelibext:”目錄中: copy c:jswdk-1.0.1libservlet.jar c:jdk1.2.2jrelibext.
創建一個JSP網站
現在該是把所有這些JSP語法派上用場的時候了。我們將創建一個網頁,它有一個輸入表單,可以使用戶輸入一個股票代號以獲得出當前股價(有20分鐘)。如果輸入有誤,則顯示報錯網頁。
quote.jsp
首先,用 這個代碼 創建一個quote.jsp網頁並將其保存在JSWDK安裝目錄下的網頁目錄中。大多數的網頁是標准的HTML,其間散布著JSP代碼。第六行是一個網頁指示,表示將把所有錯誤發送到“errorPage.jsp”文中。第13到15行是一個腳本片段,主要說明只有提供“符號”參數才會顯示表格。“If”代碼段在32到34行結束。第17行定義了要用的JavaBean,第18行從參數加載JavaBean的符號屬性。第27行到29行顯示Bean的屬性。除了"if "代碼段,實際上並不涉及其它Java代碼。
errorPage.jsp
下一步,將下列JSP源代碼保存到網頁目錄中的“errorPage.jsp”文件中。“這是一個錯誤網頁”的提示為第一行,它將isErrorPage網頁提示屬性設置為真。上一頁說了明錯誤網頁的位置,本頁則說明這就是錯誤網頁。其它JSP文件中的JSP專用代碼只有訪問隱含例外對象才用到。網頁只顯示其值:
<%@ page isErrorPage="true" %>
<html>
<head>
<title>Error Page</title>
</head>
<body>
<h1>Our Error Page</h1></font>
<!-- Print Exception -->
We got ourselves an exception:
<%= exception %>
<a href="quote.jsp">Restart</a>
</body>
</html>。
Quotes.java
Quotes JavaBean 利用Yahoo資源來獲得股票價格。需要將此 資源保存到JSWDK安裝目錄下“classescomjguru”目錄中的“quotes.java”文件中。請在此用JSDK中的Javac編輯器來編輯它。
你的第一個JSP網頁。
創建了這兩個JSP文件,建立了JavaBean資源文件並編輯了它後,你就可以從http://localhost:8080/quote.jsp加載“quote.jsp”文件以查看結果,假設你沒有更改JSWDK安裝設置,轉而使用別的端口。這個網頁當然能做得更漂亮,但是它已實現了需要實現的功能,並且很好地展示了JSP的功能。