JSP入門教程
JavaServer Pages (JSP)是基于Java的技術,用于創建可支持跨平臺及跨Web服務器的動態網頁。;
JSP可與微軟的Active Server Pages (ASP)相媲美,但JSP使用的是類似于HTML的標記和Java 代碼片段而不是用VBScript。當你使用不提供ASP本地支持的Web服務器(例如 Apache或Netscape服務器)時,你就可以考慮使用JSP了。你雖然也可以為這些服務器弄一個ASP附加軟件模塊,但是太昂貴了?,F在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="200453092147.htm.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的功能。
歡迎使用JavaServer Pages(以下簡稱JSP)技術—制作動態內容網頁的方法。;
如果你希望學習這篇教程的話,我想你一定是這項技術的新手。你可能想成為一名利用JSP技術開發網絡應用程序的程序員或者網頁設計師。本教程中包含了一系列JSP的技巧和一些簡單的代碼的寫法,每一步都舉了一組例子來講述原理。;
我建議你在學習本教程之前先去看一看FAQ,了解如果配置你的服務器好讓他能支持并運行JSP。那樣你就可以跳過前邊的內容直接看你感興趣的內容了。;
OK,費話少說,Let’s go!
第一課:真正的開始;
現在開始做我們的第一個JSP頁面。圖1-1展示了一個最簡單的JSP頁面,接下來是兩段代碼。;
[dukebanner.html];
<table border=0 width=400 cellspacing=0 cellpadding=0>;
<tr>;
<td height=150 width=150> </td>;
<td width=250> </td>;
</tr>;
<tr>;
<td width=150> </td>;
<td align=right width=250>;
<img src=duke.waving.gif></td></tr></table><br>;
helloworld.jsp;
<%@ page info="a hello world example" %>;
<html>;
<head><title>Hello, World</title></head>;
<body bgcolor="#ffffff" background="background.gif">;
<%@ include file="dukebanner.html" %>;
<table>;
<tr>;
<td width=150> </td>;
<td width=250 align=right> <h1>Hello, World!</h1> </td>;
</tr>;
</table>;
</body>;
</html>;
頁面說明:;
在很多JSP文件中你都要寫上這樣的說明。在helloword.jsp中:;
<%@ page info="a hello world example" %>;
傻瓜也看得出來,這句話沒什么大用,只是簡要的說明一下這段代碼的作用。;
你可以在JSP文件中的任何地方寫這種代碼,但是好的習慣是把他寫在最前面,還有,因為他是JSP標簽,記住一定要放在<html>前面,呵;
include說明:;
include用來在主JSP文件中調用本地的一個其他文件,通常是一些版權信息啦,腳本語言啦等其他任何你想在其他文件中重復使用的代碼。在這個例子中就是調用了一個圖片其實。大家明白這個意思就得了。;
隨便說兩句:;
在JSP中對寫法非常敏感,不可以有一點錯誤。舉個例子,把<jsp:useBean>寫成<jsp:usebean>那樣服務器會出現錯誤信息。一些如類名,包名,路徑名還有其他的敏感的標簽等千萬不要寫錯。有一些JSP標簽拿不準的話就去查一下JavaServer Pages語法卡片。;
代碼寫好了,如何試驗一下呢?;
我這里寫的UNIX下的方法,如果你用Windows,那么換一下路徑就可以了;
1、 先建一個目錄:../jswdk-1.0/examples/jsp/tutorial/helloworld;
2、 把這些文件拷過去background.gif, duke.waving.gif, dukebanner.html, and helloworld.jsp;
3、 cd ../jswdk-1.0,然后startserver;
4、 開一個瀏覽器,;
5、 http://yourMachineName:8080/examples/jsp/tutorial/helloworld/helloworld.jsp
第二課:用HTML表單;
大多數情況下,商業的網站都要有一些表單,比如說輸入一下消費者的姓名啦,地址啦,或者敲一個詞來用搜索引擎來查一下啦,或者市場人員從來訪者處收集一些數據供參考什么的。;
那些表單傳回的數據怎么處理的?;
來訪者通過表單向JSP引擎輸入了數據,并保存在了request對象中,那么接下來怎么辦?;
圖2-1向你展示了數據流是如何在服務器和客戶之間傳遞的(至少在SUN的JSP reference implementation是這么做的,別的JSP引擎工作起來可能會有一點點的不同,其實大同小異,都差不多);
字兒太小了,可能看不大清吧?俺來解釋一下了只好。;
首先,JSP引擎把存放在request對象中的數據發到JSP頁面指定的服務器端的組件(JavaBeans組件, servlet,或者enterprise bean),組件收到這些個數據以后,有可能再存這些數據到數據庫或者其他的地方存放起來,同時,返回一個response對象給JSP引擎。JSP引擎再把response對象傳給JSP頁面,這時的頁面包含了定義好的格式和從服務器端得到的數據。這時JSP引擎和Web服務器再發送一個整理好的完整的頁面給客戶,也就是這們在瀏覽器上看到的結果??蛻艉头掌鏖g的通信協議可以用HTTP,當然也可以用其他的。;
Request和Response對象在你制作的JSP原代碼中起作用。到于request對象到底怎么用,我要在接下來詳細的講給你聽。;
如何創建表單;
用HTML定義一些有代表性的表單做成一個JSP文件,然后用JSP標簽在表單和服務器端對象(通常都用Bean)傳遞數據。一般情況下是這么干的:;
1、 寫JSP原文件,創建一些HTML的表單并命名。;
2、 在Java文件里寫Bean,定義屬性,GET或者SET方法來配合已經被你指定好名字的表單。;
3、 回到JSP原文件中,增加<jsp:useBean>標簽來創建一個或者調用一個現成的Bean。;
4、 增加<jsp:setProperty>標簽設置HTML表單中需要SET方法的Bean的屬性。;
5、 增加<jsp:getProperty>標簽設置HTML表單中需要GET方法的Bean的屬性。;
6、 如果需要處理更多的用戶數據,用request對象。;
說了半天你可能看不懂,其實看一個例子你就懂了。;
先看一個簡單的hello的例子吧:;
這段程序其實還是計算機程序里那個最經典的“hello,world的程序,只不過呢,我使他撓了一點彎兒,使他看起來比較智能和復雜。首先你輸入你的名字,然后Duke跟你說:“hello!
看看代碼吧:;
dukebanner.html;
<table border="0" width="400" cellspacing="0" cellpadding="0">;
<tr>;
<td height="150" width="150"> </td>;
<td width="250"> </td>;
</tr>;
<tr>;
<td width="150"> </td>;
<td align="right" width="250">;
<img src="duke.waving.gif"> </td>;
</tr></table><br>;
主JSP文件:hellouser.jsp;
<%@ page import="hello.NameHandler" %>;
<jsp:useBean id="mybean" scope="page" class="hello.NameHandler" />;
<jsp:setProperty name="mybean" property="*" />;
<html>;
<head><title>Hello, User</title></head>;
<body bgcolor="#ffffff" background="background.gif">;
<%@ include file="dukebanner.html" %>;
<table border="0" width="700">;
<tr><td width="150"> </td>;
<td width="550">;
<h1>My name is Duke. What's yours?</h1></td></tr>;
<tr><td width="150" </td><td width="550">;
<form method="get">;
<input type="text" name="username" size="25">;
<br>;
<input type="submit" value="Submit">;
<input type="reset" value="Reset">;
</td></tr>;
</form>;
</table>;
<%;
If ( request.getParameter("username") != null );
{;
%>;
<% @ include file="response.jsp" %>;
<% };
%>;
</body></html>;
回應文件:response.jsp;
<table border="0" width="700">;
<tr>;
<td width="150"> </td>;
<td width="550">;
<h1>Hello, <jsp:getProperty name="mybean" property="username" />!;
</h1>;
</td>;
</tr>;
</table>;
處理數據的Bean:(namehandler.java);
package hello;;
public class NameHandler;
{;
private String username;;
public NameHandler() {;
username = null;;
};
public void setUsername( String name ) {;
username = name;;
};
public String getUsername() {;
return username;;
};
};
建立HTML表單;
一個HTML的窗分為三個部分:<form>標簽,輸入方法,提交按鈕發數據到服務器。一般的HTML頁面里,是這么寫的<form method=get action=someurl>,在其他的頁面里的action屬性可能是其他特殊的CGI程序或者其他能處理數據的程序,那么在JSP里邊是怎么用的呢,呵,如果你想把數據發到Bean里的話那么你可以省略action里邊的東里了,直接寫<jsp:useBean>標簽或者其他特定的JSP文件了。接下來的那些表單和普通的HTML差不多了,<input>的方法,然后加一個提交按鈕,可能還有一個Reset按鈕,對了,別忘了,還得給每一個input表單加一個名字。;
這么寫:<input type="text" name="username">;
使用GET和POST方法;
用GET和POST方法可以發數據到服務器,在JSP程序中GET和POST方法可以發數據到Bean、servlet、或者其他服務器端的組件。;
理論上說,GET是從服務器上請求數據,POST是發送數據到服務器。事實上,GET方法是把數據參數隊列(query string)加到一個URL上,值和表單是一一對應的。比如說,name=John。在隊列里,值和表單用一個&符號分開,空格用+號替換,特殊的符號轉換成十六進制的代碼。因為這一隊列在URL里邊,這樣隊列的參數就能看得到,可以被記錄下來,或更改。通常GET方法還限制字符的大小。事實上POST方法可以沒有時間限制的傳遞數據到服務器,用戶在瀏覽器端是看不到這一過程的,所以POST方法比較適合用于發送一個保密的(比如信用卡號)或者比較大量的數據到服務器。;
寫Bean;
如果JSP程序用到了Bean,你就得按照JavaBeans API的說明設計你的Bean。;
記住下面兩個關鍵部分。;
如果JSP程序里用<jsp:getProperty>標簽,那你就得在Bean里邊配合的GET方法。;
如果JSP程序進而用 <jsp:setProperty>標簽,那你就得在Bean里邊配合的Set方法。;
設置參數到Bean或者從里邊取參數將在以后的部分詳細介紹。;
傳數據到Bean;
把HTML表單的數據傳到Bean里需要兩個工作:;
· 用<jsp:useBean>標簽創建或者定位到Bean;
· 在Bean里面用<jsp:serProperty>設置屬性值;
第一步用<jsp:useBean>標簽創建或者定位到Bean一定要用在<jsp:setProperty>之前,<jsp:useBean>首先按照你指定的名字查找Bean,如果沒找到,會給你指定一個。允許在一個JSP文件中創建一個Bean,然后再另一個文件中調用,這就給了Bean一個很廣泛的運行空間。;
第二步在Bean里面用<jsp:setProperty>設置屬性值。最簡單的方法是把值定義成與表單名相配合。舉個例子,如果你把表單名定義成“username那么,你就在Bean里定義屬性“username然后用方法getUsername和setUsername。;
當然也可以定義成不同的名字,只要你不認為麻煩。誰讓你記憶力好呢!;
Request對象;
用戶輸入的數據用來存放在Request對象里,用javax.servlet.HttpServletRequest來執行(你也可以用其他不同的工具來執行,但他們其實都是javax.servlet.HttpServletRequest的子集);
你也可以直接用scriptlet來直接訪問Request對象。Scriptlet將在下一講里邊詳細的討論,現在你只需要知道他是用腳本語言寫的一段放在<% 和%> 之間的代碼就足夠了。在JSP 1.0中,你必須用JavaTM程序語言作為你的腳本語言。;
你經常會用到如下方法處理Request對象:;
方法;
說明;
執行結果;
getRequest;
Javax.servlet.jsp.PageContext;
返回當前Request對象;
getParameterNames;
javax.servlet.ServletRequest;
返回當前Request對象參數名;
getParameterValues;
javax.servlet.ServletRequest;
返回當前Request對象參數值;
你將會發現其他方法包括ServletRequest,HttpServletRequest或者其他任何ServletRequest的子集。;
JSP引擎經常在scenes之后使用Request對象,即使你沒有明確地在JSP文件中調用。;
從Bean中調數據到JSP頁面;
一旦用戶的數據被傳到Bean,你就想重新得到數據,然后在JSP面頁中顯示出來。想達到這一步,你就得用到<jsp:getProperty>標簽。傳Bean名和屬性名:;
<h1>Hello, <jsp:getProperty name="mybean" property="username"/>!;
<jsp:useBean>, <jsp:setProperty>, 和 <jsp:getProperty>標簽必須相配,舉個例子:;
hellouser.jsp:;
<jsp:useBean id="mybean" scope="session" class="hello.NameHandler" />;
<jsp:setProperty name="mybean" property="*" />;
response.jsp:;
<h1>Hello, <jsp:getProperty name="mybean" property="username"/>!;
在這個例子里,標簽被放在兩個文件中,但是指定的名字都是相同的,如果不同的話,那么系統會返回一個錯誤信息。;
如何運行例子;
我用的是UNIX主機,如果你用windows,那么改相應的路徑即可。;
創建路徑../jswdk-1.0/examples/jsp/tutorial/hellouser.;
把文件background.gif, duke.waving.gif, dukebanner.html, hellousr.jsp和response.jsp文件放進去。;
創建一個目錄,../jswdk-1.0/examples/WEB-INF/jsp/beans/hello;
把文件NameHandler.java和NameHandler.class放進去。;
cd../jswdk-1.0然后startserver;
打開瀏覽器http://計算機名:8080/examples/jsp/tutorial/hellouser/hellouser.jsp
使用腳本;
在有些地方,你大概要加一些好的,成熟的程序到你的JSP頁里,JSP的標簽雖然很強大,但是完成某些工作還是比較費力的困難的。這時你可以使用腳本語言段來補充JSP標簽。;
使用的JSP引擎是支持腳本語言的,SUN的JSP參考文說明,必須使用Java程序語言來編寫腳本,但是其他第三方的JSP引擎允許使用其他語言來寫腳本程。;
如何增加腳本;
首先,你必須了解一些增加腳本元素到JSP頁中的一些基本規則;
1、 在JSP頁面里用Page指令定義腳本(默認值是Java,一般不需要定義);
2、 聲明語法<%!……%>聲明變量和方法(函數)。;
3、 表達式語法<%=……%>定義腳本語言表達式;
4、 腳本語法〈%……%>可以操作聲明、表達式和其他類型合法的代碼段在頁腳本語言。;
5、 一定要在結尾加%>標簽;
聲明、表達式、腳本使用起來有一些相似,但也有一些不同讓我們用一些例子來講述一下相同點和不同點吧。
聲明<%!……%>包含了一個或多個變量和方法,結尾以分號分隔。;
例:<%! Int I=0 ; %>;
<%! Int a, b ; double c ; %>;
<%! Circle a = new circle(2.0) ; %>;
在頁面中使用變量和方法之前必須聲明;
聲明的范圍通常是JSP頁,但如果頁面中使用INCLUDE指令包含其他頁面,范圍應變得擴展到被包含的頁面。;
表達式<%=……%>可以在頁面中包含任何合法的語言表達式,不用分號。;
例:<%= Math.sqrt(2) %>;
<%= item[I] %>;
<%= a+b+c %>;
<%= new java.util.date() %>;
表達式和腳本的一個關鍵的不同點就是不需要分號。如果你需要在腳本中使用表達式就必須加分號。;
腳本<%……%>允許你寫的任何數量的腳本語言;
例:<% String name=null ;;
If (request.getParmeter("name")==null{;
%>;
記住在腳本中必須使用分號結尾。;
猜數字游戲;
猜數字游戲非常的有趣,而且從這里你還可以學到很多表達式的用法。;
代碼;
顯示用的主屏幕(numguess.jsp);
<!--;
Number Guess Game;
Written by Jason Hunter, CTO, K&A Software;
[email protected], http://www.servlets.com;
Copyright 1999, K&A Software;
Distributed by Sun Microsystems with permission;
-->;
<%@ page import = "num.NumberGuessBean" %>;
<jsp:useBean id="numguess" class="num.NumberGuessBean" scope="session" />;
<jsp:setProperty name="numguess" property="*" />;
<html>;
<head><title>Number Guess</title></head>;
<body bgcolor="white">;
<font size=4>;
<% if (numguess.getSuccess() ) { %>;
Congratulations! You got it.;
And after just <%= numguess.getNumGuesses() %>tries.<p>;
<% numguess.reset(); %>;
Care to <a href="numguess.jsp">try again</a>?;
<% } else if (numguess.getNumGuesses() == 0) { %>;
Welcome to the Number Guess game.<p>;
I'm thinking of a number between 1 and 100.<p>;
<form method=get>;
What's your guess? <input type=text name=guess>;
<input type=submit value="Submit">;
</form>;
<% } else { %>;
Good guess, but nope. Try <b><%= numguess.getHint() %></b>.;
You have made <%= numguess.getNumGuesses() %> guesses.;
<p>I'm thinking of a number between 1 and 100.;
<p><form method=get>;
What's your guess? <input type=text name=guess>;
<input type=submit value="Submit">;
</form>;
<% } %>;
</font>;
</body>;
</html>;
操作程序(NumberGuessBean.java);
// Number Guess Game;
// Written by Jason Hunter, CTO, K&A Software;
// [email protected], http://www.servlets.com;
// Copyright 1999, K&A Software;
// Distributed by Sun Microsystems with permission;
package num;;
import java.util.*;;
public class NumberGuessBean {;
int answer;;
boolean success;;
String hint;;
int numGuesses;;
public NumberGuessBean() {;
reset();;
};
public void setGuess(String guess) {;
numGuesses++;;
int g;;
try {;
g = Integer.parseInt(guess);;
};
catch (NumberFormatException e) {;
g = -1;;
};
if (g == answer) {;
success = true;;
};
else if (g == -1) {;
hint = "a number next time";;
};
else if (g < answer) {;
hint = "higher";;
};
else if (g > answer) {;
hint = "lower";;
};
};
public boolean getSuccess() {;
return success;;
};
public String getHint() {;
return "" + hint;;
};
public int getNumGuesses() {;
return numGuesses;;
};
public void reset() {;
answer = Math.abs(new Random().nextInt() % 100);
+ 1;;
success = false;;
numGuesses = 0;;
};
};
在JSP文件中使用腳本;
numguess.jsp是一個非常有趣兒的用腳本寫的例子,你看他的結構其實是一個很大的IF……ELSE結構,但是很一個從句又都是用HTML寫的,看起來象一個大的程序段。;
不過你也不一定非得象numguess.jsp那樣用HTML和JSP標簽一起來寫腳本。在<%和%>標簽之間,你可以寫任意多行的腳本代碼,在通常情況下,盡量少用腳本來處理程序,而盡可能的使用servlets或者Beans,這樣你的程序看起來會非常的清析,明了。話又說回來,怎么寫JSP還得根據你的習慣和愛好,我不強迫非得使用任何一種方法,SUN的JSP詳細說明書不規定腳本的長度。;
用標簽組合腳本;
使用HTML和JSP標簽來寫腳本的時候,注意前后的標簽不要忘記,一定要“封好。說的不明白,舉個例子吧:;
<% } else { %> <!-- 用JSP標簽的時候先關上 -->;
... 這時候用JSP標簽吧 ...;
<% } %> <!-- 這樣你應該看懂了吧?! -->;
開始的時候這種做法看起來可能有一點奇怪,但它以確保你JSP文件編譯的時候腳本的成功轉換。;
那么,腳本什么時候執行呢?;
一個JSP原文件的處理分為兩個階段:一個是HTTP的編譯時候,一個是請求的處理時間。;
HTTP編譯的時候,當用戶第一次讀JSP頁面的時候,JSP的原代碼被編譯成CLASS,通常是servlet。HTML標簽和JSP標簽在這個時候同時被處理了,這之前用戶還沒有任何的請求被提交。;
請求處理時間是當用戶在JSP頁面中提交了一個請求,這時請求由客戶端被request對象傳到了服務器端,JSP引擎根據用戶提交的值執行編譯過的JSP文件或者servlet。;
當你在JSP頁中使用腳本的時候,你必須知道他們什么時候被執行。聲明在HTTP編譯階段就已經被處理了,其他腳本,表達式在編譯JSP文件的時候也可用。表達式在HTTP編譯的時候也被執行了。表達式的值被轉換成了字符串被插入到JSP文件中一塊兒被編譯。其實在請求階段,腳本也是可以利用的。;
如何運行例子;
我現在給出的都是在UNIX風格下的路徑,如果你用Windows,那么改成Windows風格路徑;
1、猜數字游戲在裝TOMCAT或者JSWDK的時候就已經裝好了。;
2、.jsp和.html文件在../jswdk-1.0.1/examples/num中;
3、.java和.class文件在../jswdk-1.0.1/examples/WEB-INF/jsp/bean/num中;
4、開瀏覽器,http://機器名/examples/jsp/num/numguess.jsp;
相關文章:
