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

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

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

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

get/hello.htmHTTP/1.1:請(qǐng)求行

Host:

:請(qǐng)求頭

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

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

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

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

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

圖5-1頁(yè)面交互關(guān)系程序算法:

ex5_1.jsp:

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

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

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

程序代碼:

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)上單選問(wèn)答題問(wèn)題分析:由一個(gè)頁(yè)面輸出單選試題,由另一頁(yè)面獲取用戶選擇,統(tǒng)計(jì)考生得分。程序結(jié)構(gòu):

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

ex5_2.jsp:

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

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

程序代碼:

ex5_2.jsp:<HTML><%@pagecontentType="text/html;charset=GB2312"%><BODYbgcolor=cyan><FONTsize=4><FORMaction="answer.jsp"method=postname=form><P>詩(shī)人李白是中國(guó)歷史上哪個(gè)朝代的人:<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>小說(shuō)紅樓夢(mèng)的作者是:<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用戶注冊(cè)[例子5.3]使用散列表,保存注冊(cè)的用戶名,實(shí)現(xiàn)用戶注冊(cè)問(wèn)題分析:由一個(gè)頁(yè)面創(chuàng)建一個(gè)接受用戶名輸入的窗口;另一頁(yè)面獲取用戶名,實(shí)現(xiàn)用戶注冊(cè)。程序結(jié)構(gòu):本程序由兩個(gè)JSP頁(yè)面文件構(gòu)成。ex5_3.jsp頁(yè)面將用戶名提交給login.jsp頁(yè)面,login.jsp實(shí)現(xiàn)用戶注冊(cè)。兩頁(yè)面的交互關(guān)系如圖5-3所示。ex5_3.jsp頁(yè)面login.jsp頁(yè)面注冊(cè)圖5-3頁(yè)面交互關(guān)系程序算法:

ex5_3.jsp:

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

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

程序代碼: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="注冊(cè)"></form></font></body></html>5.1.4獲取客戶環(huán)境信息

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

頁(yè)面。兩頁(yè)面的交互關(guān)系如圖5-4所示。

程序算法:

ex5_4.jsp

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

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

.jsp頁(yè)面提交圖5-4頁(yè)面交互關(guān)系程序代碼: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對(duì)象客戶訪問(wèn)服務(wù)器使用的是HTTP請(qǐng)求包,系統(tǒng)將HTTP請(qǐng)求包封裝為request對(duì)象。服務(wù)器響應(yīng)客戶時(shí),即向客戶發(fā)送信息時(shí),使用的是HTTP響應(yīng)包

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

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

addHeader(String

head,Stringvalue)向包里添加一個(gè)頭(head)及對(duì)應(yīng)值(value)

sendRedirect(URL

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

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

1xx:1開(kāi)頭的3位數(shù)字,主要用于實(shí)驗(yàn)。

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

3xx:3開(kāi)頭的3位數(shù)字,表明處理客戶的請(qǐng)求以前,應(yīng) 做一些別的處理。

4xx:4開(kāi)頭的3位數(shù)字,表明瀏覽器請(qǐng)求是非法的或無(wú) 效的。

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

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

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

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

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

1.創(chuàng)建表單

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

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

1.輸出當(dāng)前時(shí)間

2.添加響應(yīng)頭”Refresh”,其值是1。

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

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

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

ex5_7.jsp:

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

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

2.對(duì)姓名進(jìn)行編碼

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

程序代碼:

ex5_8.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODYbgcolor=cyan><FONTsize=3><P>單擊下面的超級(jí)鏈接:<BR><AHREF="staus1.jsp">狀態(tài)行表示請(qǐng)求超時(shí)<BR><AHREF="staus2.jsp">狀態(tài)行表示請(qǐng)求成功<BR><AHREF="staus3.jsp">狀態(tài)行表示服務(wù)器內(nèi)部錯(cuò)</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對(duì)象客戶與服務(wù)器的通訊是通過(guò)HTTP協(xié)議完成的。但是,HTTP協(xié)議是一種無(wú)狀態(tài)協(xié)議。即,一個(gè)客戶向服務(wù)器發(fā)送請(qǐng)求(request),然后服務(wù)器返回響應(yīng)(response),連接就關(guān)閉了。服務(wù)器端不保留客戶與服務(wù)器每一次連接的信息,因此,服務(wù)器無(wú)法判斷上下兩次連接是否是同一客戶。要想記住客戶的連接信息,必須使用會(huì)話對(duì)象(session)。session對(duì)象記錄了每個(gè)客戶與服務(wù)器的連接信息。1.會(huì)話從一個(gè)客戶打開(kāi)瀏覽器連接到服務(wù)器的某個(gè)服務(wù)目錄(這其間,客戶訪問(wèn)的是同一web目錄中的網(wǎng)頁(yè)),到客戶關(guān)閉瀏覽器,這一過(guò)程稱為一個(gè)會(huì)話。這時(shí),在服務(wù)器端,系統(tǒng)為該客戶創(chuàng)建了一個(gè)session對(duì)象。在客戶端,系統(tǒng)為該客戶創(chuàng)建了Cookie對(duì)象。一個(gè)客戶對(duì)同一服務(wù)目錄中不同網(wǎng)頁(yè)的訪問(wèn)屬于同一會(huì)話。2.客戶的session對(duì)象與服務(wù)目錄當(dāng)一個(gè)客戶首次訪問(wèn)服務(wù)目錄中的一個(gè)JSP頁(yè)面時(shí),JSP引擎為該客戶創(chuàng)建一個(gè)session對(duì)象。同一客戶訪問(wèn)的服務(wù)目錄不同,JSP引擎為該客戶創(chuàng)建不同的session對(duì)象。從時(shí)間上看,若客戶離開(kāi)先前的服務(wù)目錄,連接到其它服務(wù)器或者服務(wù)目錄,當(dāng)再次回到先前服務(wù)目錄時(shí),JSP引擎不再給客戶分配新的session對(duì)象,而是使用先前的session對(duì)象。只有當(dāng)客戶關(guān)閉瀏覽器或這個(gè)session對(duì)象達(dá)到了最大生存時(shí)間,該客戶的session對(duì)象才被取消,這時(shí)服務(wù)器與客戶的會(huì)話關(guān)系消失。3.Session對(duì)象與Cookie

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

key.Object

obj)

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

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

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

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

獲取當(dāng)前session對(duì)象最后一次被操作的時(shí)間,單位是毫秒publicint

getMaxInactiveInterval()

獲取session對(duì)象的生存時(shí)間publicvoidsetMaxInactiveInterval(intn)

設(shè)置session對(duì)象的生存時(shí)間(單位是秒)publicvoidremoveAttribue(Stringkey)

從當(dāng)前session對(duì)象中刪除關(guān)鍵字是key的對(duì)象。publicStringgetId()

獲取session對(duì)象的編號(hào)invalidate()

使session對(duì)象無(wú)效publicboolean

isNew()

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

ex5_9.jsp:1.獲取訪問(wèn)本頁(yè)面的客戶的session對(duì)象ID號(hào)

2.輸出ID號(hào)

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

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

liu.jsp:1.獲取訪問(wèn)本頁(yè)面的客戶的session對(duì)象ID號(hào)

2.輸出ID號(hào)

3.設(shè)置超鏈接,鏈接到wang.jsp頁(yè)面

wang.jsp:1.獲取訪問(wèn)本頁(yè)面的客戶的session對(duì)象ID號(hào)

2.輸出ID號(hào)

3.設(shè)置超鏈接,鏈接到ex5_9.jsp頁(yè)面

file.jsp:1.獲取訪問(wèn)本頁(yè)面的客戶的session對(duì)象ID號(hào)

2.輸出ID號(hào)

3.設(shè)置超鏈接,鏈接到ex5_9.jsp頁(yè)面程序代碼:

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

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

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

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

您的session對(duì)象的ID是:<br><br><%=s%>

<p>單擊超連接,連接到wang頁(yè)面<BR><AHREF="<%=str%>">歡迎到wang頁(yè)面來(lái)!</A>

</BODY></HTML>

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

您的session對(duì)象的ID是:<br><br><%=s%>

<p>單擊超連接,連接到ex5_9頁(yè)面<BR><AHREF="<%=str%>">歡迎到ex5_9頁(yè)面來(lái)!</A></BODY></HTML>

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

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

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

.jsp頁(yè)面提交姓名account.jsp頁(yè)面提交商品名圖5-7頁(yè)面交互關(guān)系程序算法:

ex5_10.jsp:

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

first.jsp:

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

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

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

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

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

3.將"屬性名-值"對(duì),即("goods",sp)添加到session對(duì)象中4.從session對(duì)象中獲取姓名和商品名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>輸入您想購(gòu)買的商品連接到結(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);//對(duì)姓名進(jìn)行編碼

shangpin=getString(shangpin);//對(duì)商品名進(jìn)行編碼

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

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

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

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

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

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

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

key,Object

obj)

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

獲取application對(duì)象中含有的關(guān)鍵字key的對(duì)象。由于任何對(duì)象都可以添加到application對(duì)象中,因此用該方法取回對(duì)象時(shí),應(yīng)強(qiáng)制轉(zhuǎn)化為原來(lái)的類型。publicEnumerationgetAttributeNames()

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

從當(dāng)前application對(duì)象中刪除關(guān)鍵字是key的對(duì)象。publicStringgetServletInfo()

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

類聲明這個(gè)對(duì)象,再使用getServletContext()方法對(duì)這個(gè)application對(duì)象初始化5.4.1讀取系統(tǒng)信息[例子5.12]輸出本頁(yè)面所在的實(shí)際路徑、使用的JSP引擎、application對(duì)象對(duì)應(yīng)的字符串。程序結(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("本頁(yè)面文件的實(shí)際路徑:");out.print(application.getRealPath(path)+"<p>");//通過(guò)相對(duì)路徑//獲得實(shí)際路徑

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

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

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

ex5_13.jsp:

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

messagePane.jsp:

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

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

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

showMessage.jsp:

1.從application對(duì)象中獲取向量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>輸入您的留言標(biāo)題:

<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="無(wú)標(biāo)題";}

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

sendMessage(s);

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

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

評(píng)論

0/150

提交評(píng)論