Java-Web-程序設(shè)計(jì)模塊3_第1頁(yè)
Java-Web-程序設(shè)計(jì)模塊3_第2頁(yè)
Java-Web-程序設(shè)計(jì)模塊3_第3頁(yè)
Java-Web-程序設(shè)計(jì)模塊3_第4頁(yè)
Java-Web-程序設(shè)計(jì)模塊3_第5頁(yè)
已閱讀5頁(yè),還剩77頁(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)介

模塊3服務(wù)器交互JavaWeb程序設(shè)計(jì)“十三五”職業(yè)教育國(guó)家規(guī)劃教材配套資源目錄項(xiàng)目6用戶注冊(cè)表單信息獲取及顯示項(xiàng)目7處理服務(wù)器響應(yīng)項(xiàng)目8存儲(chǔ)用戶會(huì)話項(xiàng)目9電子商務(wù)網(wǎng)站的購(gòu)物模塊制作小結(jié)習(xí)題項(xiàng)目6用戶注冊(cè)表單信息獲取及顯示6.1項(xiàng)目描述與實(shí)現(xiàn)(1)描述編寫用戶注冊(cè)功能,注冊(cè)信息包括用戶名、密碼、性別、E-mail、熟練開發(fā)語(yǔ)言,如下圖所示。分析:為了提高開發(fā)效率,開發(fā)過(guò)程采用Eclipse和Dreamweaver搭配開發(fā),設(shè)計(jì)顯示界面部分全部用Dreamweaver實(shí)現(xiàn),代碼在界面制作自動(dòng)生成基礎(chǔ)上在Eclipse中編寫,最后在Eclipse中測(cè)試運(yùn)行。項(xiàng)目6用戶注冊(cè)表單信息獲取及顯示6.1項(xiàng)目描述與實(shí)現(xiàn)(1)描述提交后,顯示用戶輸入的數(shù)據(jù),如下圖所示。項(xiàng)目6用戶注冊(cè)表單信息獲取及顯示6.1項(xiàng)目描述與實(shí)現(xiàn)(2)實(shí)現(xiàn)過(guò)程①表單制作

在項(xiàng)目中,利用Dreamweaver制作表單,設(shè)置相關(guān)屬性,如圖3-3所示,使其自動(dòng)生成HTML5風(fēng)格的表單頁(yè)面代碼,見程序3-1。項(xiàng)目6用戶注冊(cè)表單信息獲取及顯示6.1項(xiàng)目描述與實(shí)現(xiàn)(2)實(shí)現(xiàn)過(guò)程①表單制作程序3-1:exam6_reg.jsp<%@pagecontentType="text/html;charset=utf-8"language="java"%><!DOCTYPEHTML><html><head><metahttp-equiv="Content-Type"content="text/html;charset=utf-8"><title>用戶注冊(cè)</title></head><body><formid=”reg”name=”reg”method=”post”action=”exam6_reg_do.jsp”>

用戶注冊(cè)<br/>

用戶名:<inputname=”username”type=”text”id=”username”/><br/>

密碼:<inputname=”password”type=”password”id=”password”/><br/>

性別:<inputtype=”radio”name=”sex”value=”male”/>男

<inputtype=”radio”name=”sex”value=”female”/>女<br/>E-mail:<inputname=”email”type=”text”id=”email”/><br/>

熟練開發(fā)語(yǔ)言:<inputname=”lan”type=”checkbox”id=”lan”value=”java”/>Java<inputname=”lan”type=”checkbox”id=”lan”value=”c”/>C<inputname=”lan”type=”checkbox”id=”lan”value=”c#”/>C#<br/><inputtype=”submit”name=”Submit”value=”提交”/><inputtype=”reset”name=”Submit2”value=”重置”/></form></body></html>項(xiàng)目6用戶注冊(cè)表單信息獲取及顯示6.1項(xiàng)目描述與實(shí)現(xiàn)(2)實(shí)現(xiàn)過(guò)程

②顯示頁(yè)面制作

在Dreamweaver中制作表格,如圖3-4所示,調(diào)整好樣式后,在Eclipse中編寫獲取表單的代碼。代碼見程序3-2。項(xiàng)目6用戶注冊(cè)表單信息獲取及顯示6.1項(xiàng)目描述與實(shí)現(xiàn)

(2)實(shí)現(xiàn)過(guò)程

②顯示頁(yè)面制作程序3-2:exam6_reg_do.jsp中<body>標(biāo)簽中的編碼如下<body><%Stringusername=request.getParameter(“username”);Stringpassword=request.getParameter(“password”);Stringsex=request.getParameter(“sex”);Stringemail=request.getParameter(“email”);String[]lan=request.getParameterValues(“l(fā)an”);Stringlans=””;if(lan!=null){ for(inti=0;i<lan.length;i++) { lans=lans+lan[i]+”,”; }}%><h2>用戶提交注冊(cè)信息</h2><table><tr><td>用戶名:</td><td><%=username%></td></tr><tr><td>密碼:</td><td><%=password%></td></tr><tr><td>性別:</td><td><%=sex%></td></tr><tr><td>E-mail:</td><td><%=email%></td></tr><tr><td>熟練開發(fā)語(yǔ)言:</td><td><%=lans%></td></tr></table></body>項(xiàng)目6用戶注冊(cè)表單信息獲取及顯示6.1項(xiàng)目描述與實(shí)現(xiàn)

(2)實(shí)現(xiàn)過(guò)程②顯示頁(yè)面制作代碼分析:程序3-1中,通過(guò)表單提交給顯示頁(yè)面exam6_reg_do.jsp,主要通過(guò)表單的action進(jìn)行關(guān)聯(lián)。具體代碼為<formid=”reg”name=”reg”method=”post”action=”exam6_reg_do.jsp”>,其他部分設(shè)置好各表單元素的屬性。程序3-2中獲取表單提交來(lái)的數(shù)據(jù),這里用到了JSP的內(nèi)置對(duì)象request,通過(guò)request對(duì)象的getParameter(Stringname)方法獲取的表單元素為name的參數(shù)值,通過(guò)getParameterValues(Stringname)方法獲取表單元素為name的批量參數(shù)值。項(xiàng)目6用戶注冊(cè)表單信息獲取及顯示6.1項(xiàng)目描述與實(shí)現(xiàn)

(2)實(shí)現(xiàn)過(guò)程③調(diào)試運(yùn)行在Eclipse中運(yùn)行exam6_reg.jsp,輸入內(nèi)容測(cè)試,提交后顯示效果如圖所示。項(xiàng)目6用戶注冊(cè)表單信息獲取及顯示6.2新知識(shí)點(diǎn)——JSP內(nèi)置對(duì)象、request(1)JSP內(nèi)置對(duì)象概述為了簡(jiǎn)化Web頁(yè)面的開發(fā)過(guò)程,JSP提供了一些由容器實(shí)現(xiàn)和管理的對(duì)象,這些對(duì)象在JSP中可以直接使用,不需要JSP頁(yè)面編寫進(jìn)行實(shí)例化,可以直接使用,此類對(duì)象稱之為JSP的內(nèi)置對(duì)象。JSP中規(guī)范定義了9個(gè)內(nèi)置對(duì)象,分別是request、response、session、application、out、page、pageContext、config和exception。其說(shuō)明見表。對(duì)象所屬類說(shuō)明requestjavax.servlet.http.HttpServletRequest封裝了客戶端的請(qǐng)求信息responsejavax.servlet.http.HttpServletResponse包含了響應(yīng)客戶請(qǐng)求的相關(guān)信息sessionjavax.servlet.http.HttpSession與當(dāng)前請(qǐng)求相關(guān)的會(huì)話applicationjavax.servlet.ServletContext存放全局變量,實(shí)現(xiàn)用戶間的數(shù)據(jù)共享outjavax.servlet.jsp.JspWriter向客戶端輸出數(shù)據(jù)的對(duì)象pagejava.lang.Object指當(dāng)前JSP頁(yè)面本身,作用類似于thispageContextjavax.servlet.jsp.PageContext提供了對(duì)JSP頁(yè)面內(nèi)所有的對(duì)象及名字空間的訪問(wèn)configjavax.servlet.servletConfigServlet初始化時(shí),向其傳遞配置參數(shù)的對(duì)象exceptionjava.lang.Throwable頁(yè)面運(yùn)行中發(fā)生異常而產(chǎn)生的對(duì)象項(xiàng)目6用戶注冊(cè)表單信息獲取及顯示6.2新知識(shí)點(diǎn)——JSP內(nèi)置對(duì)象、request(2)request

request對(duì)象是JSP內(nèi)置對(duì)象中最常用的對(duì)象之一,其主要用于處理客戶端的請(qǐng)求??梢酝ㄟ^(guò)該對(duì)象的方法來(lái)獲取相關(guān)數(shù)據(jù)。其常用方法見表所示。方法說(shuō)明StringgetParameter(Stringname)返回名為name的請(qǐng)求參數(shù)的值,如果該參數(shù)不存在,則返回nullEnumeration<String>getParameterNames()返回包含所有請(qǐng)求參數(shù)名稱的枚舉對(duì)象String[]getParameterValues(Stringname)返回所有的名為name的請(qǐng)求參數(shù)的值,如果該參數(shù)不存在,則返回nullMap<String,String[]>getParameterMap()返回包含所有請(qǐng)求參數(shù)的Map<參數(shù)名,參數(shù)值數(shù)組>voidsetAttribute(Stringname,Objecto)在當(dāng)前request中存儲(chǔ)一個(gè)名為name的屬性值oObjectgetAttribute(Stringname)返回當(dāng)前request中存儲(chǔ)的名為name的屬性值,如果該屬性不存在,則返回nullvoidremoveAttribute(Stringname)刪除當(dāng)前request中存儲(chǔ)的名為name的屬性Enumeration<String>getAttributeNames()返回包含當(dāng)前request中所有屬性名稱的枚舉對(duì)象StringgetContentType()返回當(dāng)前請(qǐng)求的MIME類型項(xiàng)目6用戶注冊(cè)表單信息獲取及顯示6.2新知識(shí)點(diǎn)——JSP內(nèi)置對(duì)象、request(2)request

request對(duì)象是JSP內(nèi)置對(duì)象中最常用的對(duì)象之一,其主要用于處理客戶端的請(qǐng)求??梢酝ㄟ^(guò)該對(duì)象的方法來(lái)獲取相關(guān)數(shù)據(jù)。其常用方法見表3-2所示。(request對(duì)象的方法有很多,其他方法請(qǐng)查閱相關(guān)手冊(cè))intgetContentLength()返回請(qǐng)求體的長(zhǎng)度(以字節(jié)為單位)StringgetCharacterEncoding()返回當(dāng)前請(qǐng)求的字符編碼方式voidsetCharacterEncoding(Stringencoding)設(shè)定請(qǐng)求體的字符編碼方式StringgetRemoteAddr()返回發(fā)送此請(qǐng)求的客戶端的IP地址StringgetRemoteHost()返回發(fā)送此請(qǐng)求的客戶端的完整主機(jī)名StringgetScheme()返回當(dāng)前請(qǐng)求的發(fā)送方式,如http、https及ftpStringgetServerName()獲取接受此請(qǐng)求的服務(wù)器的主機(jī)名intgetServerPort()獲取接受此請(qǐng)求的端口號(hào)StringgetRequestURI()獲取當(dāng)前request所請(qǐng)求的URIStringgetQueryString()獲取URL后所帶的查詢字符串ServletContextgetServletContext()返回當(dāng)前request所在的servlet上下文環(huán)境,相當(dāng)于application對(duì)象HttpSessiongetSession()獲取與當(dāng)前請(qǐng)求相關(guān)聯(lián)的HttpSession對(duì)象Cookie[]getCookies()返回瀏覽器隨著此次請(qǐng)求所送的所有Cookie項(xiàng)目6用戶注冊(cè)表單信息獲取及顯示6.3擴(kuò)展——中文亂碼處理、request中其他信息獲?。?)中文亂碼處理在基于JSP的開發(fā)過(guò)程中,如果處理不當(dāng),經(jīng)常會(huì)遇到中文亂碼問(wèn)題,其中比較常見的是JSP頁(yè)面亂碼和客戶端提交給服務(wù)器端的中文數(shù)據(jù)亂碼兩種情形。JSP頁(yè)面亂碼通常是由于page指令中的編碼設(shè)置不當(dāng)造成的;而客戶端提交數(shù)據(jù)亂碼是由于請(qǐng)求體字符編碼設(shè)置不當(dāng)造成的。假如將程序3-1中的page指令改為<%@pagecontentType="text/html"language="java"%>,則頁(yè)面將出現(xiàn)如圖3-6(a)所示的結(jié)果;如果該指令改為<%@pagecontentType="text/html;charset=UTF-8"language="java"pageEncoding="ISO-8859-1"%>,則頁(yè)面將出現(xiàn)如圖3-6(b)所示的結(jié)果;而如果將該指令改為<%@pagecontentType="text/html;charset=ISO-8859-1"language="java"pageEncoding="UTF-8"%>,則頁(yè)面將出現(xiàn)如圖3-6(c)所示的結(jié)果。由此可見,page指令中的pageEncoding和contentType屬性設(shè)置不當(dāng)都會(huì)造成中文亂碼。3-6(a)3-6(c)3-6(b)項(xiàng)目6用戶注冊(cè)表單信息獲取及顯示6.3擴(kuò)展——中文亂碼處理、request中其他信息獲取(1)中文亂碼處理當(dāng)客戶端提交的請(qǐng)求數(shù)據(jù)中含有中文時(shí),如果沒(méi)有為該請(qǐng)求體設(shè)置編碼或者編碼設(shè)置不當(dāng),則服務(wù)器端獲得的中文數(shù)據(jù)將發(fā)生亂碼。如將6.1節(jié)的表單增加個(gè)人簡(jiǎn)介后,程序?yàn)閑xam6_reg_2.jsp,其提交后顯示會(huì)是亂碼。正是由于服務(wù)器端獲得的中文數(shù)據(jù)已經(jīng)是亂碼,造成在該顯示注冊(cè)信息的結(jié)果頁(yè)面中顯示的中文呈現(xiàn)亂碼,因此對(duì)含有中文的表單數(shù)據(jù)要進(jìn)行編碼設(shè)置。其主要方法為在獲取程序中設(shè)置能支持中文的編碼方式,且使request的字符集與結(jié)果頁(yè)面字符集保持一致,見程序3-3。

項(xiàng)目6用戶注冊(cè)表單信息獲取及顯示6.3擴(kuò)展——中文亂碼處理、request中其他信息獲?。?)中文亂碼處理程序3-3:exam6_reg_2_do.jsp獲取參數(shù)數(shù)據(jù)代碼片段<%request.setCharacterEncoding(“utf-8”);Stringusername=request.getParameter(“username”);Stringpassword=request.getParameter(“password”);Stringsex=request.getParameter(“sex”);Stringemail=request.getParameter(“email”);String[]lan=request.getParameterValues(“l(fā)an”);Stringintro=request.getParameter(“intro”);Stringlans=””;if(lan!=null){ for(inti=0;i<lan.length;i++) { lans=lans+lan[i]+”,”; }}%>項(xiàng)目6用戶注冊(cè)表單信息獲取及顯示6.3擴(kuò)展——中文亂碼處理、request中其他信息獲?。?)中文亂碼處理代碼分析:在程序3-3中,調(diào)用request對(duì)象的setCharacterEncoding()方法對(duì)于request對(duì)象的字符集進(jìn)行設(shè)置,使表單用post方式提交中文能正常獲取。因?yàn)榍昂箜?yè)面都采用utf-8字符集,所以此處設(shè)置字符集為utf-8。設(shè)置字符集后,其后邊獲取中文參數(shù)都不再是亂碼,運(yùn)行效果如下圖所示。項(xiàng)目6用戶注冊(cè)表單信息獲取及顯示6.3擴(kuò)展——中文亂碼處理、request中其他信息獲?。?)獲得客戶端請(qǐng)求的相關(guān)信息

HttpServletRequest包含很多可以獲取與當(dāng)前請(qǐng)求相關(guān)信息的方法,具體可查看API文檔,下面的例子將展示其中一部分方法的使用,exam6_request.jsp是提交請(qǐng)求的頁(yè)面,exam6_showInfo.jsp是處理請(qǐng)求的頁(yè)面,在此頁(yè)面中將調(diào)用request對(duì)象的各種方法,以獲取與當(dāng)前請(qǐng)求相關(guān)的一些信息。運(yùn)行效果如圖3-10、3-11所示。項(xiàng)目6用戶注冊(cè)表單信息獲取及顯示6.3擴(kuò)展——中文亂碼處理、request中其他信息獲取(2)獲得客戶端請(qǐng)求的相關(guān)信息說(shuō)明:圖3-11中獲取的客戶端IP地址和主機(jī)名為0:0:0:0:0:0:0:1,這是Ipv6的地址格式,相當(dāng)于Ipv4的。

exam6_showInfo.jsp的主要代碼見程序3-4。程序3-4:exam6_showInfo.jsp獲取與request相關(guān)信息的代碼片段當(dāng)前請(qǐng)求的MIME類型:<%=request.getContentType()%><br/>請(qǐng)求體的長(zhǎng)度:<%=request.getContentLength()%>字節(jié)<br/>當(dāng)前請(qǐng)求的字符編碼方式:<%=request.getCharacterEncoding()%><br/>客戶端的IP地址:<%=request.getRemoteAddr()%><br/>客戶端的完整主機(jī)名:<%=request.getRemoteHost()%><br/>客戶端端口號(hào):<%=request.getRemotePort()%><br/>當(dāng)前請(qǐng)求的發(fā)送方式:<%=request.getScheme()%><br/>服務(wù)器的主機(jī)名:<%=request.getServerName()%><br/>服務(wù)器端口號(hào):<%=request.getServerPort()%><br/>當(dāng)前request所請(qǐng)求的URI:<%=request.getRequestURI()%><br/>項(xiàng)目7處理服務(wù)器響應(yīng)7.1項(xiàng)目描述與實(shí)現(xiàn)1.實(shí)現(xiàn)四則運(yùn)算測(cè)試功能(1)描述:

針對(duì)剛學(xué)會(huì)整數(shù)四則運(yùn)算的小學(xué)生,開發(fā)一個(gè)測(cè)試網(wǎng)站。要求在測(cè)試頁(yè)面中能隨機(jī)產(chǎn)生一個(gè)四則運(yùn)算式,當(dāng)用戶在userAnswer表單域內(nèi)填寫答案并提交后,獲取用戶所填的答案,判斷答案的對(duì)錯(cuò)后,如果錯(cuò)誤則進(jìn)入錯(cuò)誤提示頁(yè)面;如果正確則進(jìn)入正確頁(yè)面。項(xiàng)目7處理服務(wù)器響應(yīng)答題正確時(shí)的頁(yè)面答題不正確時(shí)的提示頁(yè)面7.1項(xiàng)目描述與實(shí)現(xiàn)1.實(shí)現(xiàn)四則運(yùn)算測(cè)試功能項(xiàng)目7處理服務(wù)器響應(yīng)7.1項(xiàng)目描述與實(shí)現(xiàn)1.實(shí)現(xiàn)四則運(yùn)算測(cè)試功能(2)實(shí)現(xiàn)過(guò)程①測(cè)試頁(yè)面。

在測(cè)試頁(yè)面exam7_test.jsp中,需要生成一個(gè)簡(jiǎn)單的四則運(yùn)算式,即生成兩個(gè)操作數(shù)和一個(gè)操作符,并制作一個(gè)表單,將用戶所填的答案?jìng)鬟f到處理頁(yè)面。項(xiàng)目7處理服務(wù)器響應(yīng)程序3-5:exam7_test.jsp<%@pagelanguage=”java”contentType=”text/html;charset=UTF-8”pageEncoding=”UTF-8”%><% Randomrand=newRandom(); inta=rand.nextInt(100);//隨機(jī)生成第一個(gè)操作數(shù),操作數(shù)控制在100以內(nèi) intb=rand.nextInt(100);//隨機(jī)生成第二個(gè)操作數(shù) intoperator=rand.nextInt(4);//生成代表操作符的整數(shù) intanswer=0;//參考答案 out.print(a); switch(operator){ case0: out.print(“+”); answer=a+b; break; case1: out.print(“-“); answer=a-b; break; case2: out.print(“*”); answer=a*b; break; case3: answer=a/b; out.print(“/”); } out.print(b); out.print(“=”);%>7.1項(xiàng)目描述與實(shí)現(xiàn)1.實(shí)現(xiàn)四則運(yùn)算測(cè)試功能(2)實(shí)現(xiàn)過(guò)程①測(cè)試頁(yè)面。項(xiàng)目7處理服務(wù)器響應(yīng)代碼分析:程序3-5中,利用java.util.Random類的nextInt(inta)方法來(lái)生成整型隨機(jī)數(shù),該方法能夠隨機(jī)生成一個(gè)[0,a)范圍的整數(shù),為了降低用戶的答題難度,將兩個(gè)操作數(shù)的范圍都控制在100以內(nèi)。此外,操作符的產(chǎn)生也是通過(guò)產(chǎn)生一個(gè)0-3之間的整數(shù),然后將0至3這四個(gè)不同的整數(shù)值對(duì)應(yīng)成加、減、乘、除這四個(gè)操作符。為了在處理頁(yè)面中能夠判斷用戶答案的正確性,所以在表單中使用了一個(gè)隱藏域<inputtype=”hidden”name=”answer”value=”<%=answer%>”/>將參考答案的值傳遞給相應(yīng)的action,并使用一個(gè)文本域userAnswer來(lái)傳遞用戶所填寫的答案。程序3-5:exam7_test.jsp<formaction=”exam7_test_do.jsp”method=”get”> <inputtype=”hidden”name=”answer”value=”<%=answer%>”/> <inputtype=”text”name=”userAnswer”/><br/> <inputtype=”submit”value=”提交”/></form>7.1項(xiàng)目描述與實(shí)現(xiàn)1.實(shí)現(xiàn)四則運(yùn)算測(cè)試功能(2)實(shí)現(xiàn)過(guò)程①測(cè)試頁(yè)面。項(xiàng)目7處理服務(wù)器響應(yīng)7.1項(xiàng)目描述與實(shí)現(xiàn)1.實(shí)現(xiàn)四則運(yùn)算測(cè)試功能注意:在本代碼中,form的提交方式,即method屬性被設(shè)置為“get”方式(這是method屬性的默認(rèn)值,不用顯式設(shè)置也可),這是html表單除“post”外的另一種提交方式,這兩種方式的區(qū)別是:(1)get方法將form中提交的用戶數(shù)據(jù)作為查詢字符串附加到action屬性所指定的url后進(jìn)行傳遞,如程序3-5中的表單某一次提交后的url將會(huì)變?yōu)椤県ttp://localhost:8080/JavaWebExample/chapter3/exam7_test_do.jsp?answer=83&userAnswer=0”,即查詢字符串和URL之間用“?”隔開,每個(gè)參數(shù)之間用“&”隔開。雖然HTTP協(xié)議規(guī)范并沒(méi)有對(duì)URL長(zhǎng)度進(jìn)行限制,但是由于各種瀏覽器和服務(wù)器對(duì)URL的長(zhǎng)度都有自己的長(zhǎng)度限定,所以我們?cè)谑褂胓et方式提交數(shù)據(jù)時(shí),要注意其長(zhǎng)度不能超出使用瀏覽器的URL長(zhǎng)度限制。雖然get方式傳輸?shù)臄?shù)據(jù)量比較小,但執(zhí)行效率要比post方式高。(2)post方法將表單內(nèi)的提交數(shù)據(jù)封裝在html請(qǐng)求體內(nèi)進(jìn)行傳遞,傳遞數(shù)據(jù)大小一般沒(méi)有限制,可以傳遞較大的數(shù)據(jù)量。但是有時(shí)為了避免惡意用戶使用大量數(shù)據(jù)對(duì)服務(wù)器進(jìn)行攻擊,服務(wù)器也會(huì)做相應(yīng)的限制。項(xiàng)目7處理服務(wù)器響應(yīng)7.1項(xiàng)目描述與實(shí)現(xiàn)1.實(shí)現(xiàn)四則運(yùn)算測(cè)試功能(2)實(shí)現(xiàn)過(guò)程②測(cè)試結(jié)果處理頁(yè)面

exam7_test_do.jsp獲取測(cè)試頁(yè)面?zhèn)鬟f過(guò)來(lái)的參考答案以及用戶輸入的答案之后,通過(guò)對(duì)比,判斷出需要跳轉(zhuǎn)到的結(jié)果頁(yè)面。程序3-6:exam7_test_do.jsp中<body>標(biāo)簽內(nèi)的代碼<body><% try{ intanswer=Integer.parseInt(request.getParameter(“answer”)); intuserAnswer=Integer.parseInt(request.getParameter(“userAnswer”)); if(answer==userAnswer){ response.sendRedirect(“exam7_test_correct.jsp”); }else{ response.sendRedirect(“exam7_test_error.jsp?answer=”+answer); } }catch(NumberFormatExceptione){ out.println(“您必須輸入整數(shù)作為答案!”); }

%></body>項(xiàng)目7處理服務(wù)器響應(yīng)程序3-7:exam7_test_correct.jsp中<body>標(biāo)簽內(nèi)的代碼<body><pstyle="font-size:20px;color:blue">

恭喜,答對(duì)了!</p><ahref=”exam7_test.jsp”>繼續(xù)答題</a></body>7.1項(xiàng)目描述與實(shí)現(xiàn)1.實(shí)現(xiàn)四則運(yùn)算測(cè)試功能(2)實(shí)現(xiàn)過(guò)程②測(cè)試結(jié)果處理頁(yè)面程序3-8:exam7_test_error.jsp中<body>標(biāo)簽內(nèi)的代碼<body><pstyle="font-size:20px;color:red">

您的答案不正確,正確答案應(yīng)該是<%=request.getParameter("answer")%>!</p><ahref=”exam7_test.jsp”>繼續(xù)答題</a></body>項(xiàng)目7處理服務(wù)器響應(yīng)代碼分析:程序3-6中,獲取請(qǐng)求參數(shù)answer和userAnswer后,將其轉(zhuǎn)換為整型,由于用戶可能會(huì)在測(cè)試頁(yè)面填入其它字符,導(dǎo)致類型轉(zhuǎn)換出錯(cuò)而拋出異常,所以此處將所有邏輯代碼放在一個(gè)try塊中,即一旦拋出NumberFormatException,便不再繼續(xù)執(zhí)行,而是打印出“您必須輸入整數(shù)作為答案!”的提示。對(duì)比用戶輸入的答案和參考答案后,如果二者相等,則使用內(nèi)置對(duì)象response的sendRedirect()方法重定向到exam7_test_correct.jsp(代碼如程序3-7所示)頁(yè)面;如果不相等,則重定向到錯(cuò)誤提示頁(yè)面exam7_test_error.jsp(代碼如程序3-8所示),且為了在提示頁(yè)面中能夠提示用戶正確答案,將參考答案作為URL查詢參數(shù)傳遞過(guò)去。7.1項(xiàng)目描述與實(shí)現(xiàn)1.實(shí)現(xiàn)四則運(yùn)算測(cè)試功能(2)實(shí)現(xiàn)過(guò)程②測(cè)試結(jié)果處理頁(yè)面項(xiàng)目7處理服務(wù)器響應(yīng)7.1項(xiàng)目描述與實(shí)現(xiàn)2.定時(shí)刷新頁(yè)面(1)描述

某些網(wǎng)站,如某些bbs論壇,會(huì)定時(shí)刷新頁(yè)面以便讓讀者及時(shí)看到最新的話題。請(qǐng)完成網(wǎng)頁(yè)定時(shí)刷新任務(wù),即每5秒鐘刷新一次頁(yè)面,頁(yè)面上需顯示出當(dāng)前的時(shí)間(精確到秒)。項(xiàng)目7處理服務(wù)器響應(yīng)7.1項(xiàng)目描述與實(shí)現(xiàn)2.定時(shí)刷新頁(yè)面(1)實(shí)現(xiàn)①創(chuàng)建exam7_showTime.jsp②完成定時(shí)刷新功能程序3-9:exam7_showTime.jspbody部分代碼<%@pagelanguage=”java”contentType=”text/html;charset=UTF-8”pageEncoding=”UTF-8”import=”java.util.Date,java.text.SimpleDateFormat”%><body>現(xiàn)在時(shí)間:<% //創(chuàng)建Date對(duì)象,獲取當(dāng)前時(shí)間 Datedate=newDate(); SimpleDateFormatf=newSimpleDateFormat(“yyyy年MM月dd日hh:mm:ss”); out.println(f.format(date));//設(shè)定名為”Refresh”的響應(yīng)頭,值”5”代表每5秒刷新一次本頁(yè)面 response.setHeader(“Refresh”,“5”);%></body>代碼分析:本程序采用response對(duì)象的setHeader方法,對(duì)于HTTP響應(yīng)Refresh進(jìn)行設(shè)置,設(shè)置為5秒刷新一次當(dāng)前頁(yè)面。項(xiàng)目7處理服務(wù)器響應(yīng)7.2新知識(shí)點(diǎn)-responseJSP的內(nèi)置對(duì)象response代表服務(wù)器端返回給客戶端的響應(yīng),其主要用于處理響應(yīng)數(shù)據(jù)。該對(duì)象的方法主要包括處理響應(yīng)頭的相關(guān)屬性的方法、設(shè)定響應(yīng)狀態(tài)碼的方法、重定向方法、設(shè)置響應(yīng)體相關(guān)內(nèi)容和屬性的方法等。其常用方法見下表所示。方法說(shuō)明voidsetHeader(Stringname,Stringvalue)為名為name的響應(yīng)頭設(shè)定值為valuebooleancontainsHeader(Stringname)判斷響應(yīng)對(duì)象中是否有名為name的頭voidaddCookie(Cookiecookie)將參數(shù)指定的cookie添加到response對(duì)象中voidsendRedirect(Stringlocation)將頁(yè)面重定向到參數(shù)所指定的URLvoidsetContentType(Stringtype)設(shè)置響應(yīng)的MIME類型PrintWritergetWriter()得到返回客戶端的打印流項(xiàng)目7處理服務(wù)器響應(yīng)7.2新知識(shí)點(diǎn)-response(1)setHeader方法用來(lái)設(shè)置響應(yīng)頭報(bào)文。

常用的響應(yīng)頭屬性有“Content-Type”、“Refresh”、“Expires”等。其中較常用的是“Refresh”屬性,可以用來(lái)定時(shí)刷新頁(yè)面或者定時(shí)跳轉(zhuǎn)到其它頁(yè)面。如:response.setHeader(“Refresh”,“5”);表示每5秒刷新一下當(dāng)前頁(yè)面;response.setHeader(“Refresh”,“5;url=a.jsp”);表示5秒后跳轉(zhuǎn)到a.jsp頁(yè)面。(2)sendRedirect方法和<jsp:forward>指令的區(qū)別:①sendRedirect方法不僅可以重定向到當(dāng)前應(yīng)用程序的其他資源,而且可以跳轉(zhuǎn)到URL參數(shù)指定的其它任何站點(diǎn)的可訪問(wèn)資源。這種跳轉(zhuǎn)可以說(shuō)是一種完全的跳轉(zhuǎn),瀏覽器將請(qǐng)求新的URL地址,在地址欄上顯示的是新的URL地址。原頁(yè)面和新頁(yè)面之間不能共享request數(shù)據(jù)。②<jsp:forward>指令只能轉(zhuǎn)發(fā)到同一個(gè)Web應(yīng)用程序內(nèi)的資源,它只是向服務(wù)器請(qǐng)求目標(biāo)地址的資源,服務(wù)器將相應(yīng)的響應(yīng)資源讀取過(guò)來(lái)之后發(fā)送給瀏覽器,所以在客戶端瀏覽器地址欄中不會(huì)顯示出轉(zhuǎn)向后的地址。轉(zhuǎn)發(fā)頁(yè)面和轉(zhuǎn)發(fā)到的頁(yè)面可以共享request里面的數(shù)據(jù)。(3)response對(duì)象的其他方法請(qǐng)查閱相關(guān)手冊(cè)。項(xiàng)目7處理服務(wù)器響應(yīng)7.2新知識(shí)點(diǎn)-outout對(duì)象是javax.servlet.jsp.JspWriter類的實(shí)例,表示一個(gè)輸出流,用于向客戶端輸出數(shù)據(jù)。查閱API文檔可知,JspWriter對(duì)象和由ServletResponse的getWriter()方法得到的PrintWriter對(duì)象是有依賴關(guān)系的。如果頁(yè)面沒(méi)有緩沖區(qū),那么寫入JspWriter對(duì)象的數(shù)據(jù)將直接通過(guò)PrintWriter對(duì)象進(jìn)行輸出;如果頁(yè)面有緩沖區(qū),則直到緩沖區(qū)滿且如setContentType()等操作都合法時(shí)才創(chuàng)建PrintWriter對(duì)象,由PrintWrtier對(duì)象進(jìn)行輸出。out對(duì)象的常用方法見下表所示。方法說(shuō)明voidprint(xxxx)向客戶端輸出各種數(shù)據(jù)類型的數(shù)據(jù)voidprintln(xxxx)向客戶端輸出各種數(shù)據(jù)類型的數(shù)據(jù),并在最后結(jié)束該行voidclear()清空緩沖區(qū)。如果執(zhí)行本操作時(shí)緩沖區(qū)已經(jīng)被清空輸出,則拋出IOExceptionvoidclearBuffer()清空緩沖區(qū)voidflush()輸出緩沖區(qū)中的所有數(shù)據(jù)并清空緩沖區(qū)voidclose()關(guān)閉輸出流,關(guān)閉前會(huì)將緩沖區(qū)中的數(shù)據(jù)輸出。在JSP中無(wú)需親自調(diào)用此方法,因?yàn)镴SP容器產(chǎn)生的代碼已經(jīng)包括了此方法的調(diào)用intgetBufferSize()以字節(jié)為單位返回緩沖區(qū)的大小intgetRemaining()獲取緩沖區(qū)中尚未使用的空間的大小booleanisAutoFlush()當(dāng)緩沖區(qū)滿時(shí),是否自動(dòng)清空緩沖區(qū)項(xiàng)目7處理服務(wù)器響應(yīng)7.3擴(kuò)展-設(shè)置響應(yīng)的MIME類型(1)描述將一個(gè)文本文件包含在JSP頁(yè)面中,且在顯示頁(yè)面內(nèi)容之前先讓用戶選擇查看文件所使用的方式,將三種可選方式(文本方式、網(wǎng)頁(yè)方式、Word文檔方式)放在下拉框中供用戶選擇。當(dāng)用戶選擇并點(diǎn)擊“查看”按鈕后,按用戶所選方式展現(xiàn)內(nèi)容。項(xiàng)目7處理服務(wù)器響應(yīng)7.3擴(kuò)展-設(shè)置響應(yīng)的MIME類型(2)實(shí)現(xiàn)①創(chuàng)建一個(gè)名為exam7_mimeSetting.jsp的頁(yè)面,該頁(yè)面包含讓用戶選擇查看文件方式的表單。

程序3-10:exam7_mimeSetting.jsp中<body>標(biāo)簽內(nèi)的代碼<body>請(qǐng)選擇查看文件的方式:<formaction=”exam7_mimeSetting_do.jsp”> <selectname=”type”> <optionvalue=”txt”>文本方式</option> <optionvalue=”word”>word文檔</option> <optionvalue=”html”>網(wǎng)頁(yè)方式</option> </select> <inputtype=”submit”value=”查看”/></form></body>項(xiàng)目7處理服務(wù)器響應(yīng)7.3擴(kuò)展-設(shè)置響應(yīng)的MIME類型(2)實(shí)現(xiàn)②創(chuàng)建一個(gè)名為exam7_mimeSettingTest.txt的文本文檔,與上述的JSP文件放置在同一個(gè)文件夾中。項(xiàng)目7處理服務(wù)器響應(yīng)7.3擴(kuò)展-設(shè)置響應(yīng)的MIME類型(2)實(shí)現(xiàn)③創(chuàng)建響應(yīng)頁(yè)面exam7_mimeSetting_do.jsp。程序3-11:exam7_mimeSetting_do.jsp中<body>標(biāo)簽內(nèi)的代碼<body><% Stringtype=request.getParameter(“type”); if(type.equals(“html”)){ response.setContentType(“text/html;charset=UTF-8”); }elseif(type.equals(“txt”)){ response.setContentType(“text/plain;charset=UTF-8”); }elseif(type.equals(“word”)){ response.setContentType(“application/msword;charset=UTF-8”); }

%>文件內(nèi)容如下:<jsp:includepage=”exam7_mimeSettingTest.txt”></jsp:include></body>項(xiàng)目7處理服務(wù)器響應(yīng)7.3擴(kuò)展-設(shè)置響應(yīng)的MIME類型(2)實(shí)現(xiàn)③創(chuàng)建響應(yīng)頁(yè)面exam7_mimeSetting_do.jsp。代碼分析:程序3-11首先獲取請(qǐng)求參數(shù)“type”的值,該值表示用戶所選取的查看文件的方式。當(dāng)用戶選擇使用網(wǎng)頁(yè)形式查看內(nèi)容時(shí),調(diào)用response.setContentType(“text/html;charset=UTF-8”)來(lái)將響應(yīng)的MIME設(shè)置為html類型,實(shí)際上這種類型是本頁(yè)面的默認(rèn)類型,因?yàn)樵趐age指令中已經(jīng)設(shè)定了contentType屬性的值為”text/html;charset=UTF-8”,所以這句代碼去掉也可。當(dāng)用戶選擇使用普通文本方式查看內(nèi)容時(shí),將contentType設(shè)置為“text/plain”,這樣將會(huì)把本頁(yè)面的所有內(nèi)容(包括html標(biāo)簽)以普通文本的形式全部顯示出來(lái))。當(dāng)用戶選擇使用word文檔形式查看內(nèi)容時(shí),將contentType設(shè)置為“application/msword”,那么當(dāng)客戶端接收到此頁(yè)面響應(yīng)時(shí),將會(huì)試圖調(diào)用客戶端打開word文檔的默認(rèn)應(yīng)用程序來(lái)顯示此頁(yè)面body中所包含的數(shù)據(jù)。項(xiàng)目7處理服務(wù)器響應(yīng)7.3擴(kuò)展-設(shè)置響應(yīng)的MIME類型(3)效果①當(dāng)用戶選擇以網(wǎng)頁(yè)形式查看內(nèi)容,即MIME類型為“text/html”時(shí)的響應(yīng)頁(yè)面如圖所示。②當(dāng)用戶選擇以普通文本方式查看網(wǎng)頁(yè)內(nèi)容時(shí),即MIME類型為“text/plain”時(shí)的響應(yīng)頁(yè)面如圖所示。項(xiàng)目7處理服務(wù)器響應(yīng)7.3擴(kuò)展-設(shè)置響應(yīng)的MIME類型(3)效果③當(dāng)用戶選擇以word文檔的形式查看該網(wǎng)頁(yè)數(shù)據(jù)時(shí),即MIME類型為“application/msword”時(shí)的響應(yīng)頁(yè)面將試圖調(diào)用客戶端的word文檔默認(rèn)程序來(lái)打開網(wǎng)頁(yè)內(nèi)容,下圖分別為調(diào)用MicrosoftOfficeword程序前的詢問(wèn)窗口和用戶選擇“打開”后的word窗口。項(xiàng)目8存儲(chǔ)用戶會(huì)話8.1項(xiàng)目描述與實(shí)現(xiàn)(1)判斷用戶是否已登錄

描述:實(shí)現(xiàn)如下功能:用戶成功登錄后,只要未關(guān)閉瀏覽器的情況下,可隨時(shí)訪問(wèn)本站點(diǎn)的任何頁(yè)面(當(dāng)然此處本站點(diǎn)只有登錄頁(yè)面和歡迎頁(yè)面),如果用戶在未登錄的情況下訪問(wèn)歡迎頁(yè)面,則給出相應(yīng)的提示,并在5秒后跳轉(zhuǎn)到登錄頁(yè)面。項(xiàng)目8存儲(chǔ)用戶會(huì)話8.1項(xiàng)目描述與實(shí)現(xiàn)(1)判斷用戶是否已登錄

實(shí)現(xiàn)過(guò)程:程序3-12:exam8_login_do.jsp<%@pagecontentType="text/html;charset=utf-8"language="java"%><!DOCTYPEHTML><html><head><metahttp-equiv="Content-Type"content="text/html;charset=utf-8"><title>登錄結(jié)果</title></head><body><% Stringusername=request.getParameter(“username”); Stringpassword=request.getParameter(“password”); //為了簡(jiǎn)化實(shí)現(xiàn),假設(shè)用戶名和密碼分別為tom和123就算登錄成功if(username!=null&&password!=null&&username.equals(“tom”)&&password.equals(“123”)){ //將用戶名存入session中

session.setAttribute(“username”,username); response.sendRedirect(“exam8_welcome.jsp”);}else{ out.println(“用戶名或密碼不正確,5秒后為您跳轉(zhuǎn)回登錄頁(yè)面...”); response.setHeader(“refresh”,”5;url=exam8_login.jsp”);}%></body></html>項(xiàng)目8存儲(chǔ)用戶會(huì)話8.1項(xiàng)目描述與實(shí)現(xiàn)(1)判斷用戶是否已登錄

實(shí)現(xiàn)過(guò)程:代碼分析:用戶成功登錄后,將用戶名存入session中,意味著只要是同一個(gè)用戶,在沒(méi)有關(guān)閉瀏覽器的情況下,訪問(wèn)本W(wǎng)eb應(yīng)用的任何頁(yè)面,都能通過(guò)session識(shí)別該用戶。項(xiàng)目8存儲(chǔ)用戶會(huì)話8.1項(xiàng)目描述與實(shí)現(xiàn)(1)判斷用戶是否已登錄

實(shí)現(xiàn)過(guò)程:程序3-13:exam8_welcome.jsp部分代碼<body><% //獲取session中名為”username”的對(duì)象

ObjectusernameObj=session.getAttribute(“username”); //對(duì)象為空,表示用戶并沒(méi)有登錄

if(usernameObj==null){ out.println(“您必須先登錄,5秒后為您跳轉(zhuǎn)回登錄頁(yè)面...”); response.setHeader(“refresh”,“5;url=exam8_login.jsp”); }else{ Stringusername=(String)usernameObj; out.println(username+”,歡迎您!”); }%></body>代碼分析:由登錄處理程序3-12可知,當(dāng)用戶成功登錄后便立即把該用戶的用戶名存入了session對(duì)象中,即如果用戶登錄過(guò),且過(guò)程中并沒(méi)有關(guān)閉瀏覽器,那么在訪問(wèn)本頁(yè)面時(shí)應(yīng)能在session對(duì)象中獲取到名為“username”的屬性,即程序3-13中的usernameObj不應(yīng)為null;否則便是沒(méi)有登錄,做相應(yīng)的提示后便跳轉(zhuǎn)回登錄頁(yè)面。用戶沒(méi)有登錄,直接訪問(wèn)exam8_welcome.jsp的效果圖如圖3-22所示。項(xiàng)目8存儲(chǔ)用戶會(huì)話8.1項(xiàng)目描述與實(shí)現(xiàn)(2)使用application對(duì)象制作簡(jiǎn)易留言板

描述:制作一個(gè)簡(jiǎn)易的留言板,當(dāng)用戶進(jìn)入留言板頁(yè)面(exam8_messageBoard.jsp)時(shí),該頁(yè)面顯示所有用戶留言中的最新的十條,該頁(yè)面的下方有留言輸入框,當(dāng)用戶提交留言后,刷新顯示本頁(yè)。由于至本章尚未介紹連接數(shù)據(jù)庫(kù)的相關(guān)知識(shí),所以本任務(wù)不要求將相關(guān)數(shù)據(jù)存入數(shù)據(jù)庫(kù),而是采用JSP內(nèi)置的application對(duì)象來(lái)存儲(chǔ)用戶的留言。留言板頁(yè)面的顯示效果如圖3-23所示。主要的設(shè)計(jì)思路為:將所有的留言信息存入一個(gè)List中,而每一條留言信息包括留言的用戶名、留言標(biāo)題、內(nèi)容以及時(shí)間,將這些項(xiàng)都以字符串的形式表示,然后拼接成一個(gè)表示一條留言的字符串,拼接時(shí)以分號(hào)“;”作為分隔符。每當(dāng)增加一條用戶留言時(shí),就將新留言信息(即新的字符串對(duì)象)添加到List中。為了讓所有用戶都能共享留言信息,所以將上述持有留言的List對(duì)象存入application中。項(xiàng)目8存儲(chǔ)用戶會(huì)話8.1項(xiàng)目描述與實(shí)現(xiàn)(2)使用application對(duì)象制作簡(jiǎn)易留言板

實(shí)現(xiàn)過(guò)程:創(chuàng)建名為exam8_messageBoard.jsp的JSP頁(yè)面,其內(nèi)容為留言板主頁(yè)的代碼,如程序3-14。程序3-14:留言板主頁(yè)exam8_messageBoard.jsp<body>標(biāo)簽中代碼如下所示:<body><% //從application對(duì)象中獲取存儲(chǔ)留言信息的List對(duì)象 List<String>msgList=(List<String>)application.getAttribute(“msgList”); if(msgList!=null){ Iterator<String>iter=msgList.iterator(); while(iter.hasNext()){//遍歷留言List,將各條留言顯示在本頁(yè)面上 Stringmsg=iter.next(); //以分號(hào)作為分隔符將留言的各部分內(nèi)容拆分出來(lái) String[]splitMsg=msg.split(“;”);%><divclass=”message”> <divclass=”title”>標(biāo)題:<%=splitMsg[1]%></div> <divclass=”content”><divclass=”author”><%=splitMsg[0]%>    發(fā)表于:<%=splitMsg[3]%></div>

內(nèi)容:<%=splitMsg[2]%></div></div><%}}%><divclass=”writeMsg”> <formaction=”exam8_writeMsg.jsp”method=”post”class=”form1”>

用戶名:<inputtype=”text”name=”username”/><br/>

標(biāo)題:<inputtype=”text”name=”title”/><br/>

內(nèi)容:<textareaname=”content”rows=”4”cols=”30”></textarea><br/> <inputtype=”submit”value=”留言”/> </form></div></body>項(xiàng)目8存儲(chǔ)用戶會(huì)話8.1項(xiàng)目描述與實(shí)現(xiàn)(2)使用application對(duì)象制作簡(jiǎn)易留言板代碼分析:本程序分為兩個(gè)部分,第一部分用來(lái)顯示已有留言,第二部分為輸入新留言的輸入框。本例用一個(gè)List來(lái)持有留言對(duì)象,所以顯示留言的第一步便是調(diào)用application.getAttribute(Stringname)方法將存放在application對(duì)象中的留言List獲取出來(lái),為了預(yù)防尚未有留言時(shí)msgList為null而產(chǎn)生空指針異常的情況,在遍歷顯示留言之前先用if(msgList!=null)來(lái)做限制。當(dāng)從List中遍歷顯示每一條留言信息時(shí),先將表示留言的String對(duì)象以分號(hào)“;”作為分隔符進(jìn)行拆分,依據(jù)該String的組成規(guī)則“用戶名;標(biāo)題;內(nèi)容;留言時(shí)間”,分別把拆分出來(lái)的字符串?dāng)?shù)組的各元素顯示在相應(yīng)的位置上。本頁(yè)面所使用的樣式文件可到本書官方網(wǎng)站查看完整源碼,此處不再給出。項(xiàng)目8存儲(chǔ)用戶會(huì)話8.1項(xiàng)目描述與實(shí)現(xiàn)(2)使用application對(duì)象制作簡(jiǎn)易留言板

實(shí)現(xiàn)過(guò)程:

編寫提交留言后的處理邏輯程序,代碼見程序3-15。程序3-15:添加留言的處理邏輯exam8_writeMsg.jsp<body>標(biāo)簽中代碼如下所示:<body><% request.setCharacterEncoding(“UTF-8”); Stringusername=request.getParameter(“username”); Stringtitle=request.getParameter(“title”); Stringcontent=request.getParameter(“content”); Datetime=newDate(); //將當(dāng)前請(qǐng)求中包含的留言信息組合到一個(gè)字符串中 Stringmsg=username+”;”+title+”;”+content+”;”+time.toString(); List<String>msgList=(List<String>)application.getAttribute(“msgList”); //如果當(dāng)前application范圍內(nèi)不存在留言List,則新建一個(gè)List if(msgList==null){ msgList=newLinkedList<String>(); } msgList.add(msg);//將新留言添加到留言記錄中 //由于本任務(wù)只要求保留最新的10條留言記錄,所以當(dāng)超出10條留言時(shí),刪除最早的一條 if(msgList.size()>10){ msgList.remove(0); } //將更新過(guò)的留言List存入application中 application.setAttribute(“msgList”,msgList); response.sendRedirect(“exam8_messageBoard.jsp”);%></body>項(xiàng)目8存儲(chǔ)用戶會(huì)話8.1項(xiàng)目描述與實(shí)現(xiàn)(2)使用application對(duì)象制作簡(jiǎn)易留言板代碼分析:首先獲取由request所提交的用戶名、留言標(biāo)題、內(nèi)容信息,以及系統(tǒng)的當(dāng)前時(shí)間,然后將這些內(nèi)容以分號(hào)分隔組合起來(lái)存到字符串對(duì)象msg中;得到application中持有留言的msgList之后,將msg加入到其中,然后再用這個(gè)更新后的msgList覆蓋application中舊的msgList。項(xiàng)目8存儲(chǔ)用戶會(huì)話8.2新知識(shí)點(diǎn)——session、aplication(1)sessionsession(會(huì)話)是用來(lái)在訪問(wèn)一個(gè)網(wǎng)站時(shí)發(fā)出的多個(gè)頁(yè)面請(qǐng)求或者在多次頁(yè)面跳轉(zhuǎn)之間識(shí)別同一個(gè)用戶并且存儲(chǔ)這個(gè)用戶的相關(guān)信息的一種方式。通常從一個(gè)客戶連接到某個(gè)服務(wù)器開始,直到他關(guān)閉瀏覽器離開這個(gè)服務(wù)器為止,稱之為一次會(huì)話。Servlet容器使用javax.servlet.http.HttpSession這個(gè)接口在HTTP客戶端和服務(wù)器端之間創(chuàng)建一個(gè)會(huì)話,JSP的內(nèi)置對(duì)象session就是這個(gè)接口的一個(gè)實(shí)例。一個(gè)session通常只對(duì)應(yīng)一個(gè)用戶,它有一定的生存時(shí)間,它可以使同一個(gè)用戶在訪問(wèn)同一個(gè)Web站點(diǎn)時(shí)在多個(gè)頁(yè)面連接和請(qǐng)求之間共享數(shù)據(jù)。服務(wù)器通常通過(guò)cookie或者重寫URL的方式來(lái)維持session,不過(guò)開發(fā)者無(wú)需關(guān)心這些細(xì)節(jié)。HttpSession接口的方法主要分為兩類,一類是查看和操作關(guān)于這個(gè)session的信息的方法,如session的ID、創(chuàng)建時(shí)間、最近訪問(wèn)時(shí)間等;另一類方法是將對(duì)象綁定到session中,以能夠使用戶信息在客戶端與服務(wù)器端的多次連接中能夠共享。Session對(duì)象的常用方法如表3-5所示。項(xiàng)目8存儲(chǔ)用戶會(huì)話8.2新知識(shí)點(diǎn)——session、aplication(1)session

方法說(shuō)明voidsetAttribute(Stringname,Objectvalue)將對(duì)象value綁定到session中,以name作為名字。如果已有名為name的對(duì)象與此session綁定,則覆蓋原來(lái)的對(duì)象。ObjectgetAttribute(Stringname)返回與此session綁定的名為name的對(duì)象,如沒(méi)有,則返回null。voidremoveAttribute(Stringname)刪除與此session綁定的名為name的對(duì)象Enumeration<String>getAttributeNames()以Enumeration對(duì)象的形式返回所有與此session綁定的對(duì)象的名稱longgetCreationTime()返回此session的創(chuàng)建時(shí)間,即創(chuàng)建時(shí)距離格林尼治時(shí)間的毫秒數(shù)StringgetId()返回標(biāo)識(shí)此會(huì)話的唯一的ID,此ID是servlet容器賦予的longgetLastAccessedTime()返回最近一次客戶發(fā)送請(qǐng)求的時(shí)間,以距離格林尼治時(shí)間的毫秒數(shù)計(jì)voidsetMaxInactiveInterval(intinterval)設(shè)置客戶端發(fā)送請(qǐng)求的最大時(shí)間間隔(以秒計(jì)),如果超過(guò)這個(gè)時(shí)間客戶端都沒(méi)有發(fā)送過(guò)請(qǐng)求,則使當(dāng)前session失效。參數(shù)的值如果小于等于0的話,意味著session不會(huì)自動(dòng)失效intgetMaxInactiveInterval()返回以秒計(jì)的最大不活動(dòng)時(shí)間間隔ServletContextgetServletContext()返回當(dāng)前session對(duì)象所屬的ServletContextvoidinvalidate()使session對(duì)象失效,所有與之綁定的對(duì)象都解除綁定booleanisNew()判斷當(dāng)前session對(duì)象是否為服務(wù)器端新創(chuàng)建的session,還尚未被客戶端所使用項(xiàng)目8存儲(chǔ)用戶會(huì)話8.2新知識(shí)點(diǎn)——session、aplication(2)applicationJSP內(nèi)置的application對(duì)象是javax.servlet.ServletContext類的一個(gè)實(shí)例,可以通過(guò)它和Servlet容器進(jìn)行通信,如獲取一個(gè)文件的MIME類型,轉(zhuǎn)發(fā)請(qǐng)求,寫日志文件等等;也可以通過(guò)它共享一些全局信息。Application對(duì)象表示Servlet的上下文,每臺(tái)Java虛擬機(jī)上的同一個(gè)Web應(yīng)用只有一個(gè)上下文,即當(dāng)Web應(yīng)用被部署到服務(wù)器上,服務(wù)器啟動(dòng)時(shí)就創(chuàng)建一個(gè)application對(duì)象,所有訪問(wèn)該應(yīng)用的客戶都共享同一個(gè)application對(duì)象,直到服務(wù)器關(guān)閉。因此可以通過(guò)將一些信息放在application對(duì)象里,以實(shí)現(xiàn)全局共享,當(dāng)然要注意這個(gè)“全局”只是相對(duì)的,因?yàn)椴煌腏ava虛擬機(jī)上的Servlet上下文也是不同的。其主要方法如表3-6所示。項(xiàng)目8存儲(chǔ)用戶會(huì)話8.2新知識(shí)點(diǎn)——session、aplication(2)application方法說(shuō)明ObjectgetAttribute(Stringname)獲取application中名為name的屬性Enumeration<String>getAttributeNames()返回包含當(dāng)前application中所有屬性名稱的Enumeration對(duì)象voidsetAttribute(Stringname,Objectobject)將指定的對(duì)象object與名字name綁定并存入當(dāng)前application中voidremoveAttribute(Stringname)刪除application中名為name的屬性voidlog(Stringmsg)將指定的消息寫入servlet日志文件中,日志的名稱和類型都是servlet容器已定義好的

voidlog(Stringmessage,Throwablethrowable)將說(shuō)明性的消息,以及指定的異常的跟蹤棧內(nèi)容寫到日志文件中,日志的名稱和類型都是servlet容器已定義好的StringgetContextPath()返回當(dāng)前Web應(yīng)用的上下文路徑。如本書的例子所在的應(yīng)用的上下文路徑就是/JavaWebExampleStringgetRealPath(Stringpath)返回參數(shù)給定的虛擬路徑所對(duì)應(yīng)的真實(shí)文件系統(tǒng)路徑.URLgetResource(Stringpath)返回指定路徑的URLStringgetServerInfo()獲取服務(wù)器信息StringgetMimeType(Stringfile)獲取指定文件的MIME類型項(xiàng)目8存儲(chǔ)用戶會(huì)話8.3擴(kuò)展——cookie(1)記錄用戶以往訪問(wèn)當(dāng)前站點(diǎn)的相關(guān)信息任務(wù)描述:當(dāng)用戶訪問(wèn)本網(wǎng)站的登錄頁(yè)面時(shí),能夠自動(dòng)顯示出該用戶以前訪問(wèn)本網(wǎng)站時(shí)曾經(jīng)使用過(guò)的用戶名。實(shí)現(xiàn)過(guò)程:這樣的功能一般都是基于cookie實(shí)現(xiàn)的。首先創(chuàng)建一個(gè)web應(yīng)用,當(dāng)用戶訪問(wèn)本網(wǎng)站的登錄頁(yè)面exam8_cookie_login.jsp(代碼如程序3-16所示)時(shí),該頁(yè)面讀取客戶端的cookie,如果cookie中存在username記錄,則在登錄表單的用戶名一欄中自動(dòng)填入該username值。當(dāng)用戶成功登錄后,將該username存入cookie中。登錄處理頁(yè)面exam8_cookie_login_do.jsp如程序3-17所示。項(xiàng)目8存儲(chǔ)用戶會(huì)話8.3擴(kuò)展——cookie(1)記錄用戶以往訪問(wèn)當(dāng)前站點(diǎn)的相關(guān)信息程序3-16:exam8_cookie_login.jsp<body>標(biāo)簽中代碼如下所示:<body><h6>用戶登錄</h6><% Stringusername=””;//準(zhǔn)備用來(lái)存儲(chǔ)從cookie中讀取的用戶名的變量 Cookie[]cookies=request.getCookies();//獲取客戶端與本站點(diǎn)相關(guān)的所有cookie

if(cookies!=null){ //遍歷cookies for(inti=0;i<cookies.length;i++){ CookiecurrentC=cookies[i]; //如果找到名為”username”的cookie,則將其值存入變量username中 if(currentC.getName().equals(“username”)){ username=currentC.getValue(); } } }%><formaction=”exam8_cookie_login_do.jsp”method=”post”>

用戶名:<inputtype=”text”name=”username”value=”<%=username%>”/><br/>

密碼:<inputtype=”text”name=”password”/><br/> <inputtype=”submit”value=”登錄”/></form></body>項(xiàng)目8存儲(chǔ)用戶會(huì)話8.3擴(kuò)展——cookie(1)記錄用戶以往訪問(wèn)當(dāng)前站點(diǎn)的相關(guān)信息

程序3-16:exam8_cookie_login.jsp代碼分析:程序3-16中,使用request.getCookies()方法能夠獲取當(dāng)前客戶端與本站點(diǎn)相關(guān)的所有cookie,注意當(dāng)客戶端沒(méi)有相關(guān)cookie存在時(shí),此方法返回的參數(shù)是null。當(dāng)遍歷獲取名為username的cookie值后,在名為“username”的表單域中將此值作為其value屬性的值,這樣便可以達(dá)到記錄用戶上次使用的登錄名的效果。項(xiàng)目8存儲(chǔ)用戶會(huì)話8.3擴(kuò)展——cookie(1)記錄用戶以往訪問(wèn)當(dāng)前站點(diǎn)的相關(guān)信息程序3-17:exam8_cookie_login_do.jsp<body>標(biāo)簽中代碼如下所示:<body><% Stringusername=request.getParameter(“username”); Stringpassword=request.getParameter(“password”); //假設(shè)用戶名和密碼分別為tom和123就算登錄成功

if(username!=null&&password!=null&& username.equals(“tom”)&&password.equals(“123”)){ out.println(username+”,歡迎您!”); //創(chuàng)建一個(gè)名為username的cookie Cookiec=newCookie(“username”,username); //設(shè)置該cookie的最長(zhǎng)保留時(shí)間為30天

c.setMaxAge(60*60*24*30); //將該cookie添加到reponse對(duì)象中發(fā)到客戶端

//如果該客戶端已經(jīng)存在同名cookie,則新的cookie將覆蓋原有的cookie response.addCookie(c); }else{ out.println(“登錄出錯(cuò)!”); }%></body>項(xiàng)目8存儲(chǔ)用戶會(huì)話8.3擴(kuò)展——cookie(1)記錄用戶以往訪問(wèn)當(dāng)前站點(diǎn)的相關(guān)信息代碼分析:由于到本章為止尚未介紹訪問(wèn)數(shù)據(jù)庫(kù)的知識(shí),所以登錄功能只作簡(jiǎn)單實(shí)現(xiàn),暫不涉及訪問(wèn)數(shù)據(jù)庫(kù)數(shù)據(jù),即假設(shè)用戶名和密碼分別為“tom”和“123”便算登錄成功。當(dāng)?shù)卿洺晒r(shí),使用out對(duì)象的println方法直接在本頁(yè)打印出歡迎語(yǔ)句;且將當(dāng)前的用戶名添加到一個(gè)名為username的cookie中,使用response對(duì)象的addCookie方法即可將該cookie發(fā)送到客戶端,以備下一次登錄時(shí)能夠自動(dòng)檢測(cè)到用戶名。當(dāng)在cookie的有效期內(nèi)再次訪問(wèn)登錄頁(yè)面時(shí),登錄頁(yè)面將直接把上次的登錄名“tom”顯示在用戶名輸入框內(nèi),效果如圖3-24所示。項(xiàng)目8存儲(chǔ)用戶會(huì)話8.3擴(kuò)展——cookie(2)知識(shí)點(diǎn):Cookie簡(jiǎn)介Cookie是Web服務(wù)器發(fā)送給客戶端的一小段信息。如果服務(wù)器需要在客戶端記錄某些數(shù)據(jù)時(shí),就可以向客戶端發(fā)送Cookie,客戶端接收并保存該Cookie,而且客戶端每次訪問(wèn)該服務(wù)器上的頁(yè)面時(shí)就會(huì)將Cookie隨請(qǐng)求數(shù)據(jù)一同發(fā)送給服務(wù)器。下面從向客戶端發(fā)送Cookie以及從客戶端讀取Cookie兩方面來(lái)介紹Cookie的使用方法。(1)向客戶端發(fā)送Cookie首先需要?jiǎng)?chuàng)建Cookie對(duì)象:Cookiec=newCookie(“cookieName”,“cookieValue”);然后需要調(diào)用setMaxAge(longtime)為Cookie對(duì)象設(shè)置有效時(shí)間(該時(shí)間參數(shù)以秒為單位),不然瀏覽器關(guān)閉時(shí)Cookie就會(huì)被刪除;最后使用HttpServletResponse對(duì)象的addCookie(Cookiec)方法把Cookie對(duì)象添加到HTTP響應(yīng)頭中發(fā)送到客戶端

溫馨提示

  • 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)論