第5章 JSP內(nèi)置對象_第1頁
第5章 JSP內(nèi)置對象_第2頁
第5章 JSP內(nèi)置對象_第3頁
第5章 JSP內(nèi)置對象_第4頁
第5章 JSP內(nèi)置對象_第5頁
已閱讀5頁,還剩75頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

第五章JSP內(nèi)置對象第4章學習了頁面組成元素和使用方法。本章學習JSP內(nèi)置對象的使用。使用JSP內(nèi)置對象,可以方便操作頁面,訪問頁面環(huán)境,實現(xiàn)頁面內(nèi)、頁面間、頁面與環(huán)境之間的通訊。學習目標熟悉主要內(nèi)置對象的概念理解主要內(nèi)置對象的作用域和生命期理解主要內(nèi)置對象的作用和關系熟悉主要內(nèi)置對象的使用方法5.1request對象當客戶訪問服務器頁面時,會提交一個HTTP請求。reauest對象就是對HTTP請求包的封裝。因此,使用request對象的方法,可以獲取客戶端和服務器端信息。如客戶端主機名、IP地址、傳遞參數(shù)名、參數(shù)值、服務器主機名和IP地址等等。1.HTTP請求包

一般說來,一個HTTP請求包括三個部分:一個請求行、多個請求頭、信息體。請求行:規(guī)定了請求的方法(get、post、head、delete、put等)、請求的資源、使用的HTTP協(xié)議版本號。請求頭:一個HTTP請求可以包括多個頭。頭主要說明請求客戶的主機(IP)、信息體的附加信息。信息體:請求正文。如,表單數(shù)據(jù)被封裝為信息體。下面是一個簡單的HTTP請求包的組成:

get/hello.htmHTTP/1.1:請求行

Host:

:請求頭

Name鄧小平(數(shù)據(jù)組件接受的信息):信息體(表單中的數(shù)據(jù)信息)2.request對象的常用方法getProtocol()獲取客戶向服務器提交信息所使用的通訊協(xié)議。比如http/1.1等。getServletPath()獲取客戶請求的JSP頁面文件的目錄.getContentLength()獲取客戶提交的整個信息的長度.getMethod()獲取客戶提交信息的方式.比如post或get.getHeader(Strings)獲取HTTP頭文件中由參數(shù)S指定的頭名字的值。一般來說s參數(shù)可取得頭名有accept、referer、accept-language、content-type、accept-encoding、user-agent、host、content-length、connectiong、cookie等。比如,s取值user-agnet將獲取客戶的瀏覽器的版本號等信息。2.request對象的常用方法getHeaderNames()獲取頭名字的一個枚舉。getHeaders(Strings)獲取頭文件中指定頭名字的全部值的一個枚舉。getRemoteAddr()獲取客戶的IP地址。getRemoteHost()獲取客戶機的名稱(如果獲取不到,就獲取IP地址)。getServerName()獲取服務器的名稱。getServerPort()獲取服務器的端口號。getParameterNames()獲取客戶提交的信息體部分的name參數(shù)值的一個枚舉。

3.客戶向服務器提交信息客戶通常使用HTML表單向服務器的某個JSP頁面提交信息。HTML表單的一般格式是:

<FORMmethod=get|postaction=”接受信的頁面文件”>[接受數(shù)據(jù)的組件(0~n個)]

數(shù)據(jù)提交控件</FORM>5.1.1獲取客戶提交的信息[例子5.1]從客戶端獲取信息,并在另一窗口輸出這些信息問題分析:在一個頁面創(chuàng)建表單,提供信息輸入窗口,在另一頁面,使用request對象獲取表單信息。程序結(jié)構(gòu):

ex5_1.jsp頁面創(chuàng)建表單(信息輸入窗口),用戶提交信息后,頁面定向到outInfo.jsp頁面。頁面交互關系如圖5-1所示。

圖5-1頁面交互關系程序算法:

ex5_1.jsp:

創(chuàng)建一表單,包含一個文本控件和一個提交控件

outInfo.jsp1.獲取文本框和提交控件的值

2.輸出文本框和提交控件的值ex5_1.jsp頁面outInfo.jsp頁面提交

程序代碼:

ex5_1.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODYbgcolor=cyan><FONTsize=3><FORMaction="outInfo.jsp"method=postname=form><INPUTtype="text"name="boy"><INPUTTYPE="submit"value="提交"name="submit"></FORM></FONT></BODY></HTML>outInfo.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODYbgcolor=cyan><FONTsize=4>

<!--獲取客戶端的表單信息--><%StringtextContent=request.getParameter("boy");bytec[]=textContent.getBytes("ISO-8859-1");

textContent=newString(c);StringbuttonName=request.getParameter("submit");byteb[]=buttonName.getBytes("ISO-8859-1");

buttonName=newString(b);%><!--將文本信息和按鈕信息輸出到客戶端--><P><B>獲取文本框提交的信息:</B><BR><%=textContent%><P><B>獲取按鈕的名字:</B><BR><%=buttonName%></FONT></BODY></HTML>5.1.2獲取表單提交的數(shù)據(jù)

[例子5.2]網(wǎng)上單選問答題問題分析:由一個頁面輸出單選試題,由另一頁面獲取用戶選擇,統(tǒng)計考生得分。程序結(jié)構(gòu):

ex5_2.jsp頁面將用戶選擇的答案提交給answer.jsp頁面。頁面交互關系如圖5-2所示。ex5_2.jsp頁面answer.jsp頁面提交答案圖5-2頁面交互關系程序算法:

ex5_2.jsp:

創(chuàng)建一表單,包含兩組單選按鈕。

answer.jsp1.獲取用戶提交的答案2.與正確答案比較,統(tǒng)計得分3.輸出考試結(jié)果

程序代碼:

ex5_2.jsp:<HTML><%@pagecontentType="text/html;charset=GB2312"%><BODYbgcolor=cyan><FONTsize=4><FORMaction="answer.jsp"method=postname=form><P>詩人李白是中國歷史上哪個朝代的人:<BR><INPUTtype="radio"name="r"value="a">宋朝

<INPUTtype="radio"name="r"value="b">唐朝

<INPUTtype="radio"name="r"value="c">明朝

<INPUTtype="radio"name="r"value="d"checked="ok">元朝

<P>小說紅樓夢的作者是:<BR><INPUTtype="radio"name="P"value="a">曹雪芹

<INPUTtype="radio"name="P"value="b">羅貫中

<INPUTtype="radio"name="P"value="c">李白

<INPUTtype="radio"name="P"value="c"checked="">司馬遷

<BR><INPUTTYPE="submit"value="提交答案"name="submit"></FORM></FONT></BODY></HTML>

answer.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODYbgcolor=cyan><FONTsize=3><%

intn=0;Strings1=request.getParameter("r");Strings2=request.getParameter("P");if(s1==null){s1="";}if(s2==null){s2="";}if(s1.equals("b")){n++;}if(s2.equals("a")){n++;}%><P>您得了<%=n%>分</FONT></BODY></HTML>5.1.3用戶注冊[例子5.3]使用散列表,保存注冊的用戶名,實現(xiàn)用戶注冊問題分析:由一個頁面創(chuàng)建一個接受用戶名輸入的窗口;另一頁面獲取用戶名,實現(xiàn)用戶注冊。程序結(jié)構(gòu):本程序由兩個JSP頁面文件構(gòu)成。ex5_3.jsp頁面將用戶名提交給login.jsp頁面,login.jsp實現(xiàn)用戶注冊。兩頁面的交互關系如圖5-3所示。ex5_3.jsp頁面login.jsp頁面注冊圖5-3頁面交互關系程序算法:

ex5_3.jsp:

創(chuàng)建一表單,包含一個文本框,客戶在此文本框中輸入用戶名。

login.jsp:1.創(chuàng)建一空的散列對象(hashtable)2.定義一方法putName(Strings),該方法以s為屬性名和屬性值,插入到散列對象(hashtable)中。3.從表單中獲取用戶名,若散列對象中沒有注冊過此用戶名,則將(name,name)插入到散列對象中(表示實現(xiàn)了用戶注冊),否則,提示用戶換個名字注冊。

程序代碼:ex5_3.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML> <BODY><fontsize=3><formaction="login.jsp"method=post><p>輸入你的姓名:

<INPUTTYPE=TEXTNAME="name"value="abc"><br><inputtype="submit"name=submitvalue="注冊"></form></font></body></html>5.1.4獲取客戶環(huán)境信息

[例子5.4]獲取客戶和服務器有關信息程序結(jié)構(gòu):本程序由兩個頁面構(gòu)成,ex5_4.jsp頁面提交客戶信息給getInfo.jsp

頁面。兩頁面的交互關系如圖5-4所示。

程序算法:

ex5_4.jsp

創(chuàng)建一表單,包含一文本框。

getInfo.jsp1.輸出環(huán)境信息2.輸出表單信息ex5_4.jsp頁面getInfo

.jsp頁面提交圖5-4頁面交互關系程序代碼:ex5_4.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODYbgcolor=cyan><FONTsize=3>

<FORMaction="getInfo.jsp"method=postname=form><INPUTtype="text"name="boy"><INPUTTYPE="submit"value="提交"name="submit"></FORM></FONT></BODY></HTML>5.2response對象客戶訪問服務器使用的是HTTP請求包,系統(tǒng)將HTTP請求包封裝為request對象。服務器響應客戶時,即向客戶發(fā)送信息時,使用的是HTTP響應包

,系統(tǒng)將HTTP響應包封裝為response對象。在JSP頁面中,可以使用response對象的方法動態(tài)控制響應方式,向客戶端發(fā)送數(shù)據(jù)。HTTP響應包與HTTP請求包結(jié)構(gòu)類似。

1.HTTP響應包一般說來,一個HTTP響應包由三個部分組成:一個狀態(tài)行、多個響應頭、信息體。狀態(tài)行:描述服務器處理HTTP請求的成功與否。比如,是否收到請求包、請求被拒絕、請求超時、服務器發(fā)生錯誤等等。響應頭:HTTP響應包發(fā)送的目標地址(IP)信息體:發(fā)送到服務器端的正文。如,在客戶端顯示的信息。2.response對象常用的方法

addHeader(String

head,Stringvalue)向包里添加一個頭(head)及對應值(value)

sendRedirect(URL

url)實現(xiàn)客戶重定向

setStatus(intn)設置響應的狀態(tài)代碼。3.響應包的狀態(tài)行服務器響應客戶時,它發(fā)送到客戶端的首行被稱為狀態(tài)行。狀態(tài)行由3位數(shù)的狀態(tài)代碼和描述狀態(tài)代碼的文字組成。下面是對狀態(tài)代碼的分類描述:

1xx:1開頭的3位數(shù)字,主要用于實驗。

2xx:2開頭的3位數(shù)字,表明客戶端的請求已成功。

3xx:3開頭的3位數(shù)字,表明處理客戶的請求以前,應 做一些別的處理。

4xx:4開頭的3位數(shù)字,表明瀏覽器請求是非法的或無 效的。

5xx:5開頭的3位數(shù)字,表明服務器出現(xiàn)了問題。

我們一般不需要修改狀態(tài)行,在出現(xiàn)問題時,服務器會自動響應,發(fā)送相應的狀態(tài)代碼到客戶端。也可以使用setStatus(intn)方法來增加狀態(tài)行的內(nèi)容。4.狀態(tài)代碼表

下面是服務器響應客戶時,發(fā)送到客戶端的狀態(tài)代碼描述.狀態(tài)代碼代碼說明101服務器正在升級協(xié)議100客戶可以繼續(xù)201請求成功且在服務器上創(chuàng)建了新的資源202請求已被接受但還沒有處理完畢200請求成功203客戶端給出的原信息不是發(fā)自服務器的204請求成功,但沒有新信息狀態(tài)代碼代碼說明205客戶必須重置文檔視圖206服務器執(zhí)行了部分get請求300請求的資源有多種表示301資源已經(jīng)被永久移動到新位置302資源已經(jīng)被臨時移動到新位置303應答可以在另外一個URL中找到304Get方式請求不可用305請求必須通過代理來訪問狀態(tài)代碼代碼說明400請求由語法錯誤401請求需要HTTP認證403取得了請求但拒絕服務404請求的資源部可用405請求所用的方法是不允許的406請求的資源只能用請求不能接受的內(nèi)容特性來響應407客戶必須得到認證408請求超時狀態(tài)代碼代碼說明409發(fā)生沖突,請求不能完成410請求的資源已經(jīng)不可用411請求需要一個定義的內(nèi)容長度才能處理413請求太大,被拒絕414請求的URL太大415請求的格式被拒絕狀態(tài)代碼代碼說明500服務器發(fā)生內(nèi)部錯誤,不能服務501不支持請求的部分功能502從代理和網(wǎng)關接受了不合法的字符503HTTP服務暫時不可用504服務器在等待代理服務器應答時發(fā)生超時505不支持請求的HTTP版本5.2.1不支持請求的HTTP版本[例子5.5]向客戶端輸出word類型的文件問題分析:

本題實際上要求設置page指令contentType屬性的值為:application/msword程序結(jié)構(gòu):

程序代碼:ex5_5.jsp程序算法:

1.創(chuàng)建表單

2.獲取表單提交按鈕的值

3.若提交按鈕的值是”保存”,則將page指令的contentType屬性的值設為:"application/msword;charset=GB2312",即改變文件輸出類型為msword。5.2.2控制網(wǎng)頁的刷新頻率[例子5.6]在頁面中,實時顯示當前時間問題分析:要實時顯示當前時間,必須每秒鐘刷新一次頁面,這就要求向客戶輸出的響應包中,必須含有響應頭”Refresh”,其值為1,單位是秒。程序結(jié)構(gòu):程序名:ex5_6.jsp程序算法:

1.輸出當前時間

2.添加響應頭”Refresh”,其值是1。

程序代碼:<%@pagecontentType="text/html;charset=GB2312"%><%@pageimport="java.util.*"%><HTML><BODYbgcolor=cyan><center><FONTsize=3color=red><p>現(xiàn)在的時間是:<br><%

out.println(""+newDate());response.setHeader("Refresh","1");%></FONT></center></BODY></HTML>5.3.3網(wǎng)頁重定向[例子5.7]實現(xiàn)從一個網(wǎng)頁到另一個網(wǎng)頁的重定向程序結(jié)構(gòu):本程序由兩個JSP頁面文件構(gòu)成。ex5_7.jsp頁面向redirect.jsp頁面提供姓名信息。兩個頁面的交互關系如圖5-5所示。ex5_7.jsp頁面redirect.

.jsp頁面網(wǎng)頁重定向圖5-5頁面交互關系程序算法:

ex5_7.jsp:

創(chuàng)建一表單,包含用于輸入姓名的文本框。

redirect.jsp1.獲取表單的姓名信息

2.對姓名進行編碼

3.如果姓名為空字符串,則重新定向到ex5_7.jsp頁面,否則輸出相應的信息。程序代碼:ex5_7.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODY><P>填寫姓名:<BR><FORMaction="redirect.jsp"method="get"name=form><INPUTTYPE="text"name="boy"><INPUTTYPE="submit"value="網(wǎng)頁重定向"></FORM></BODY></HTML>5.2.4顯示通訊狀態(tài)[例子5.8]設置響應的狀態(tài)行程序結(jié)構(gòu):本程序由三個JSP頁面文件構(gòu)成。頁面ex5_8.jsp通過超級鏈接,分別鏈接到status1.jsp頁面、staus2.jsp頁面、staus3.jsp頁面。

程序代碼:

ex5_8.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODYbgcolor=cyan><FONTsize=3><P>單擊下面的超級鏈接:<BR><AHREF="staus1.jsp">狀態(tài)行表示請求超時<BR><AHREF="staus2.jsp">狀態(tài)行表示請求成功<BR><AHREF="staus3.jsp">狀態(tài)行表示服務器內(nèi)部錯</FONT></BODY></HTML>

status1.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODY><%response.setStatus(408);

out.print("不顯示了");%></BODY></HTML>staus2.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODY><%response.setStatus(200);out.println("ok");%></BODY></HTML>

staus3.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODY><%response.setStatus(500);%></BODY></HTML>5.3session對象客戶與服務器的通訊是通過HTTP協(xié)議完成的。但是,HTTP協(xié)議是一種無狀態(tài)協(xié)議。即,一個客戶向服務器發(fā)送請求(request),然后服務器返回響應(response),連接就關閉了。服務器端不保留客戶與服務器每一次連接的信息,因此,服務器無法判斷上下兩次連接是否是同一客戶。要想記住客戶的連接信息,必須使用會話對象(session)。session對象記錄了每個客戶與服務器的連接信息。1.會話從一個客戶打開瀏覽器連接到服務器的某個服務目錄(這其間,客戶訪問的是同一web目錄中的網(wǎng)頁),到客戶關閉瀏覽器,這一過程稱為一個會話。這時,在服務器端,系統(tǒng)為該客戶創(chuàng)建了一個session對象。在客戶端,系統(tǒng)為該客戶創(chuàng)建了Cookie對象。一個客戶對同一服務目錄中不同網(wǎng)頁的訪問屬于同一會話。2.客戶的session對象與服務目錄當一個客戶首次訪問服務目錄中的一個JSP頁面時,JSP引擎為該客戶創(chuàng)建一個session對象。同一客戶訪問的服務目錄不同,JSP引擎為該客戶創(chuàng)建不同的session對象。從時間上看,若客戶離開先前的服務目錄,連接到其它服務器或者服務目錄,當再次回到先前服務目錄時,JSP引擎不再給客戶分配新的session對象,而是使用先前的session對象。只有當客戶關閉瀏覽器或這個session對象達到了最大生存時間,該客戶的session對象才被取消,這時服務器與客戶的會話關系消失。3.Session對象與Cookie

當JSP引擎為客戶創(chuàng)建一個session對象后,這個session對象被分配了一個String類型的ID號,JSP引擎同時將此ID號發(fā)送到客戶端,存放在Cookie中.這樣,代表同一客戶會話的session對象和Cookie對象建立了一一對應關系.即,每一客戶會話信息保存在session/Cokkie對中.4.Session對象與線程當多個客戶點擊同一頁面時,JSP引擎為每個客戶啟動一個線程,這就是說,一個客戶對應一個線程,每個線程對應一個session對象,每個線程的session對象不同。5.Session對象生命周期從一個客戶會話開始到會話結(jié)束這段時間稱為session對象的生命周期。具體上說,指客戶訪問某web目錄下的頁面到關閉瀏覽器,離開該web目錄,這段時間成為session對象的生命周期。6.Session對象的常用方法publicvoidsetAttribute(String

key.Object

obj)

session對象類似于散列表,可以調(diào)用該方法將參數(shù)Object指定的對象obj添加到session對象中,并為添加的對象指定了一個索引關鍵字。如果添加的兩個對象的關鍵字相同,則先前添加的對象被清除。publicObjectgetAttibue(Stringkey)

獲取session對象中含有的關鍵字是key的對象。由于任何對象都可以添加到session對象中,因此用該方法取回對象是,應強制轉(zhuǎn)化為原來的類型。publicEnumerationgetAttributeName()

session對象調(diào)用該方法產(chǎn)生一個枚舉對象。該枚舉對象使用nextElemets()方法遍歷session對象所含有的全部對象。publiclonggetCreationTime()

session對象調(diào)用該方法可以獲取該對象創(chuàng)建的時間。單位是毫秒(從1970年7月1日午夜起至該對象創(chuàng)建時刻所走過的毫秒數(shù))。publiclonggetLastAccessedTime()

獲取當前session對象最后一次被操作的時間,單位是毫秒publicint

getMaxInactiveInterval()

獲取session對象的生存時間publicvoidsetMaxInactiveInterval(intn)

設置session對象的生存時間(單位是秒)publicvoidremoveAttribue(Stringkey)

從當前session對象中刪除關鍵字是key的對象。publicStringgetId()

獲取session對象的編號invalidate()

使session對象無效publicboolean

isNew()

判斷是否是一個新的客戶5.3.1顯示客戶會話ID[例子5.9]同一客戶訪問兩個不同的web目錄中的頁面,查看該客戶在不同web目錄中的session對象的ID號。問題分析:創(chuàng)建兩個web目錄,并在其中部署JSP頁面,然后通過表單或超連接,將兩個web目錄中的頁面連接起來。程序結(jié)構(gòu):本程序由四個JSP頁面文件構(gòu)成。三個頁面ex5_9.jsp、liu.jsp、wang.jsp部署在目錄e:/test/5下面;file.jsp頁面部署在目錄e:/test/6下面。下面是四個頁面的交互關系如圖5-6所示。圖5-6頁面交互關系ex5_9.jsp頁面liu.jsp頁面網(wǎng)頁重定向wang.jsp頁面超鏈接file.jsp頁面超鏈接超鏈接程序算法:

ex5_9.jsp:1.獲取訪問本頁面的客戶的session對象ID號

2.輸出ID號

3.創(chuàng)建表單,該表單提交時,將信息提交給liu.jsp頁面

4.在創(chuàng)建表單,該表單提交時,將信息提交給file.jsp頁面

liu.jsp:1.獲取訪問本頁面的客戶的session對象ID號

2.輸出ID號

3.設置超鏈接,鏈接到wang.jsp頁面

wang.jsp:1.獲取訪問本頁面的客戶的session對象ID號

2.輸出ID號

3.設置超鏈接,鏈接到ex5_9.jsp頁面

file.jsp:1.獲取訪問本頁面的客戶的session對象ID號

2.輸出ID號

3.設置超鏈接,鏈接到ex5_9.jsp頁面程序代碼:

ex5_9.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODY><P><%Strings=session.getId();Stringstr=response.encodeURL("liu.jsp");%><P>您在訪問ex5_9.jsp頁面<br><br>

你的session對象的ID是:<br><br><%=s%><BR><FORMaction="<%=str%>"method=postname=form><INPUTTYPE="submit"value="轉(zhuǎn)向liu頁面"name=submit></FORM><FORMaction="../6/file.jsp"method=postname=form><INPUTTYPE="submit"value="轉(zhuǎn)向file頁面"name=submit></FORM></BODY></HTML>

liu.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODY>

<%Strings=session.getId();Stringstr=response.encodeURL("wang.jsp");%><P>你在訪問liu頁面<br><br>

您的session對象的ID是:<br><br><%=s%>

<p>單擊超連接,連接到wang頁面<BR><AHREF="<%=str%>">歡迎到wang頁面來!</A>

</BODY></HTML>

wang.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODY><%Strings=session.getId();Stringstr=response.encodeURL("ex5_9.jsp");%><P>你在訪問wang頁面<br><br>

您的session對象的ID是:<br><br><%=s%>

<p>單擊超連接,連接到ex5_9頁面<BR><AHREF="<%=str%>">歡迎到ex5_9頁面來!</A></BODY></HTML>

file.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODY>

<%Strings=session.getId();%><P>你在訪問file頁面<br><br>

您的session對象的ID是:<br><br><%=s%><P>單擊超鏈接,返回到ex5_9頁面<BR><AHREF="../5/ex5_9.jsp">歡迎到ex5_9頁面來!</A></BODY></HTML>5.3.2信息的保存和獲取[例子5.10]將購買者的姓名、商品名保存在session對象中,實現(xiàn)同一web目錄下的頁面對session對象中的信息共享。問題分析:創(chuàng)建三個頁面,第一個頁面輸入姓名,第二個頁面輸入商品名,第三個頁面實現(xiàn)結(jié)帳處理。程序結(jié)構(gòu):本程序包含三個JSP頁面文件,三個頁面文件保存在同一web目錄中。ex5_10.jsp頁面接受姓名錄入,并將姓名提交給first.jsp頁面;first.jsp頁面接受商品名的錄入,并將商品名提交給account.jsp頁面。三個頁面的交互關系如圖5-7所示。ex5_10.jsp頁面first.

.jsp頁面提交姓名account.jsp頁面提交商品名圖5-7頁面交互關系程序算法:

ex5_10.jsp:

創(chuàng)建一個包含文本控件的表單,用此文本控件錄入姓名

first.jsp:

1.獲取客戶端輸入的姓名(xm)

2.將"屬性名-值"對,即("name",xm)添加到session對象中

3.創(chuàng)建一個包含文本控件的表單,用此文本控件錄入商品名

account.jsp:1.定義一個對字符串s進行編碼的方法:publicStringgetString(Strings)

2.獲取客戶端錄入的商品名(sp)

3.將"屬性名-值"對,即("goods",sp)添加到session對象中4.從session對象中獲取姓名和商品名5.將姓名和商品名輸出到客戶端程序代碼:

ex5_10.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODYbgcolor=cyan><FONTsize=3>

<P>輸入您的姓名連接到第一百貨(first.jsp)<FORMaction="first.jsp"method=postname=form><INPUTtype="text"name="buy_name"><INPUTTYPE="submit"value="提交姓名"name=submit></FORM></BODY></HTML>

first.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODYbgcolor=cyan><FONTsize=3><%Stringxm=request.getParameter("buy_name");

session.setAttribute("name",xm);%><P>這里是第一百貨

<P>輸入您想購買的商品連接到結(jié)帳(account.jsp)<FORMaction="account.jsp"method=postname=form><INPUTtype="text"name="shangpin"><INPUTTYPE="submit"value="提交商品名"name=submit></FORM></BODY></HTML>

account.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODYbgcolor=cyan><FONTSize=3><%!//處理字符串的方法

publicStringgetString(Strings){

if(s==null){s="";}try{byteb[]=s.getBytes("ISO-8859-1");s=newString(b);}

catch(Exceptione){}returns;}%>

<%Stringsp=request.getParameter("shangpin");

session.setAttribute("goods",sp);%>

<%Stringxinming=(String)session.getAttribute("name");Stringshangpin=(String)session.getAttribute("goods");

xinming=getString(xinming);//對姓名進行編碼

shangpin=getString(shangpin);//對商品名進行編碼

%><P>這里是結(jié)帳處

<P>顧客的姓名是:<%=xinming%><P>您選擇購買的商品是:<%=shangpin%></BODY></HTML>5.3.3計數(shù)器[例子5.11]統(tǒng)計訪問頁面的客戶數(shù)。第4章的[例子4.2]講述過這種例子,那個例子的缺陷是客戶可以通過不斷刷新頁面增加計數(shù)器。在這個例子里,使用session對象的isNew()方法解決這一問題。問題分析:由于客戶刷新頁面時,session對象的ID號不會改變。當客戶刷新頁面時,讓程序檢查客戶的session

對象是不是一個新的session對象,若是新的session對象,才增加計數(shù)器的值。程序結(jié)構(gòu):程序名:ex5_11.jsp程序算法:

1.定義計數(shù)器number,用于統(tǒng)計訪問頁面的客戶數(shù)

2.定義同步方法synchronizedvoidcountPeople(),該方法使計數(shù)器number加1,并將number的值保存在文本文件count.txt中。

3.判斷訪問客戶的session對象是否是新的,若是新的session對象,則調(diào)用方法countPeople(),計數(shù)器加1。4.輸出計數(shù)器的值5.4application對象我們已經(jīng)知道,不同的客戶與服務器連接時有不同的session對象,同一客戶瀏覽同一服務器的不同目錄時,有不同的session對象。與session對象不同的是application對象。服務器啟動后,就產(chǎn)生了application對象。所有客戶的application對象是相同的一個,即,所有客戶共享這個內(nèi)置的application對象。application對象生命期

application對象隨著服務器啟動而創(chuàng)建,隨著服務器關閉而消失。application對象的生命周期指從application對象創(chuàng)建到服務器關閉這段時間。application對象與線程當多個客戶點擊同一頁面時,JSP引擎為每個客戶啟動一個線程,這些線程共享同一個application對象.由于所有客戶共享同一個application對象,任何客戶對application對象中數(shù)據(jù)的改變都會影響到其它的客戶,因此,對該對象的操作需要實現(xiàn)同步處理。application對象的常用方法publicvoidsetAttribute(String

key,Object

obj)

application對象可以調(diào)用該方法將參數(shù)Object指定的對象obj添加到application對象中,并為添加的對象指定一個索引關鍵字。如果添加的兩個對象的關鍵字相同,則先前添加的對象被清除。publicObjectgetAttibue(Stringkey)

獲取application對象中含有的關鍵字key的對象。由于任何對象都可以添加到application對象中,因此用該方法取回對象時,應強制轉(zhuǎn)化為原來的類型。publicEnumerationgetAttributeNames()

application對象條用該方法產(chǎn)生一個枚舉對象。該枚舉對象使用nextElemets()方法遍歷application對象所含有的全部對象。publicvoidremoveAttribue(Stringkey)

從當前application對象中刪除關鍵字是key的對象。publicStringgetServletInfo()

獲取Servlet編譯器的當前版本信息。注意:有些服務器不直接支持使用application對象,必須先用ServletContext

類聲明這個對象,再使用getServletContext()方法對這個application對象初始化5.4.1讀取系統(tǒng)信息[例子5.12]輸出本頁面所在的實際路徑、使用的JSP引擎、application對象對應的字符串。程序結(jié)構(gòu):

程序名:ex5_12.jsp

程序代碼:<%@pagecontentType="text/html;charset=GB2312"%><html><body><center><h1>讀取系統(tǒng)信息</h1><%Stringpath="/ex5_12.jsp";

out.print("context數(shù)據(jù)的內(nèi)容:");

out.print(application.getContext(path)+"<p>");//讀取path路徑中的//ServletContext

out.print("文件的格式:");

out.print(application.getMimeType(path)+"<p>");

out.print("本頁面文件的實際路徑:");out.print(application.getRealPath(path)+"<p>");//通過相對路徑//獲得實際路徑

out.print("jsp引擎:");

out.print(getServletInfo()+"<p>");//當前jsp引擎

out.print("application對象ID:"+getServletContext()+"<p>");%></center></body></html>5.4.2制作留言板[例子5.13]要求使用三個頁面來實現(xiàn)留言的功能。一個頁面提供留言輸入窗口;一個頁面獲取當前留言,并將留言添加到向量中;一個頁面將向量中的所有客戶留言輸出到客戶端。問題分析:由于三個頁面共享同一個session對象,這樣,把客戶的每次留言以字符串的方式添加到向量中,再把向量添加到session對象中。當客戶查看留言時,首先把向量從session對象中取出,然后把向量中的所有留言輸出到客戶端。程序結(jié)構(gòu):本程序由三個JSP頁面文件構(gòu)成。ex5_13.jsp頁面提供留言輸入窗口;messagePane.jsp頁面獲取留言窗口的字符串,將字符串添加到向量中,再把向量添加到session對象中;showMessage.jsp頁面把向量中的所有留言輸出到客戶端。三個頁面的交互關系如圖5-8所示。ex5_13.jsp頁面MessagePane.jsp頁面提交留言ShowMessage.jsp頁面返回查看留言圖5-7頁面交互關系程序算法:

ex5_13.jsp:

創(chuàng)建一個表單,包含三個信息輸入控件

messagePane.jsp:

1.定義并創(chuàng)建一個向量v

2.定義一個方法synchronizedvoidsendMessage(Strings),該方法把字符串添加到向量v中,然后把v添加到application對象中。

3.獲取留言板信息,并構(gòu)造成字符串:s4.調(diào)用方法sendMessage(s),把字符串添加到application對象中的向量v中。

showMessage.jsp:

1.從application對象中獲取向量v2.將v中每一元素作為一條記錄輸出到客戶端程序代碼:

ex5_13.jsp:<%@pagecontentType="text/html;charset=GB2312"%><%@pageimport="java.util.*"%><HTML><BODY><FORMaction="messagePane.jsp"method="post"name="form"><P>輸入您的名字:

<INPUTtype="text"name="peopleName"><BR><P>輸入您的留言標題:

<INPUTtype="text"name="Title"><BR><P>輸入您的留言:<BR><TEXTAREAname="messages"ROWs="10"COLS=36WRAP="physical"></TEXTAREA><BR><INPUTtype="submit"value="提交留言"name="submit"></FORM><FORMaction="showMessage.jsp"method="post"name="forml"><INPUTtype="submit"value="查看留言"name="look"></FORM></BODY></HTML>messagePane.jsp:<%@pagecontentType="text/html;charset=GB2312"%><%@pageimport="java.util.*"%><HTML><BODY><%!Vectorv=newVector();

ServletContextapplication;synchronizedvoidsendMessage(Strings){

v.add(s);application=getServletContext();

application.setAttribute("Mess",v);}%><%Stringname=request.getParameter("peopleName");Stringtitle=request.getParameter("Title");Stringmessages=request.getParameter("messages");

if(name==null){name="guest"+(int)(Math.random()*10000);}

if(title==null){title="無標題";}

if(messages==null){messages="無信息";}Stringtime=newDate().toString();Strings="#"+name+"#"+title+"#"+time+"#"+messages+"#";

sendMessage(s);

out.print("您的信息已經(jīng)提交!");//字符串信息保存在application對象中

%><AHREF="ex5_13.jsp">返回</A><BODY></HTML>showMessage.jsp:<%@pagecontentType="text/html;charset=GB2312"%><%@pageimport="java.util.*"%><HTML><BODY><%Vectorv=(Vector)application.getAttribute("Mess");

out.print("<tableborder=2>");

out.print("<tr>");

out.print("<th

bgcol

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論