




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
模塊3服務器交互JavaWeb程序設計“十三五”職業教育國家規劃教材配套資源目錄項目6用戶注冊表單信息獲取及顯示項目7處理服務器響應項目8存儲用戶會話項目9電子商務網站的購物模塊制作小結習題項目6用戶注冊表單信息獲取及顯示6.1項目描述與實現(1)描述編寫用戶注冊功能,注冊信息包括用戶名、密碼、性別、E-mail、熟練開發語言,如下圖所示。分析:為了提高開發效率,開發過程采用Eclipse和Dreamweaver搭配開發,設計顯示界面部分全部用Dreamweaver實現,代碼在界面制作自動生成基礎上在Eclipse中編寫,最后在Eclipse中測試運行。項目6用戶注冊表單信息獲取及顯示6.1項目描述與實現(1)描述提交后,顯示用戶輸入的數據,如下圖所示。項目6用戶注冊表單信息獲取及顯示6.1項目描述與實現(2)實現過程①表單制作
在項目中,利用Dreamweaver制作表單,設置相關屬性,如圖3-3所示,使其自動生成HTML5風格的表單頁面代碼,見程序3-1。項目6用戶注冊表單信息獲取及顯示6.1項目描述與實現(2)實現過程①表單制作程序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>用戶注冊</title></head><body><formid=”reg”name=”reg”method=”post”action=”exam6_reg_do.jsp”>
用戶注冊<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/>
熟練開發語言:<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>項目6用戶注冊表單信息獲取及顯示6.1項目描述與實現(2)實現過程
②顯示頁面制作
在Dreamweaver中制作表格,如圖3-4所示,調整好樣式后,在Eclipse中編寫獲取表單的代碼。代碼見程序3-2。項目6用戶注冊表單信息獲取及顯示6.1項目描述與實現
(2)實現過程
②顯示頁面制作程序3-2:exam6_reg_do.jsp中<body>標簽中的編碼如下<body><%Stringusername=request.getParameter(“username”);Stringpassword=request.getParameter(“password”);Stringsex=request.getParameter(“sex”);Stringemail=request.getParameter(“email”);String[]lan=request.getParameterValues(“lan”);Stringlans=””;if(lan!=null){ for(inti=0;i<lan.length;i++) { lans=lans+lan[i]+”,”; }}%><h2>用戶提交注冊信息</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>熟練開發語言:</td><td><%=lans%></td></tr></table></body>項目6用戶注冊表單信息獲取及顯示6.1項目描述與實現
(2)實現過程②顯示頁面制作代碼分析:程序3-1中,通過表單提交給顯示頁面exam6_reg_do.jsp,主要通過表單的action進行關聯。具體代碼為<formid=”reg”name=”reg”method=”post”action=”exam6_reg_do.jsp”>,其他部分設置好各表單元素的屬性。程序3-2中獲取表單提交來的數據,這里用到了JSP的內置對象request,通過request對象的getParameter(Stringname)方法獲取的表單元素為name的參數值,通過getParameterValues(Stringname)方法獲取表單元素為name的批量參數值。項目6用戶注冊表單信息獲取及顯示6.1項目描述與實現
(2)實現過程③調試運行在Eclipse中運行exam6_reg.jsp,輸入內容測試,提交后顯示效果如圖所示。項目6用戶注冊表單信息獲取及顯示6.2新知識點——JSP內置對象、request(1)JSP內置對象概述為了簡化Web頁面的開發過程,JSP提供了一些由容器實現和管理的對象,這些對象在JSP中可以直接使用,不需要JSP頁面編寫進行實例化,可以直接使用,此類對象稱之為JSP的內置對象。JSP中規范定義了9個內置對象,分別是request、response、session、application、out、page、pageContext、config和exception。其說明見表。對象所屬類說明requestjavax.servlet.http.HttpServletRequest封裝了客戶端的請求信息responsejavax.servlet.http.HttpServletResponse包含了響應客戶請求的相關信息sessionjavax.servlet.http.HttpSession與當前請求相關的會話applicationjavax.servlet.ServletContext存放全局變量,實現用戶間的數據共享outjavax.servlet.jsp.JspWriter向客戶端輸出數據的對象pagejava.lang.Object指當前JSP頁面本身,作用類似于thispageContextjavax.servlet.jsp.PageContext提供了對JSP頁面內所有的對象及名字空間的訪問configjavax.servlet.servletConfigServlet初始化時,向其傳遞配置參數的對象exceptionjava.lang.Throwable頁面運行中發生異常而產生的對象項目6用戶注冊表單信息獲取及顯示6.2新知識點——JSP內置對象、request(2)request
request對象是JSP內置對象中最常用的對象之一,其主要用于處理客戶端的請求。可以通過該對象的方法來獲取相關數據。其常用方法見表所示。方法說明StringgetParameter(Stringname)返回名為name的請求參數的值,如果該參數不存在,則返回nullEnumeration<String>getParameterNames()返回包含所有請求參數名稱的枚舉對象String[]getParameterValues(Stringname)返回所有的名為name的請求參數的值,如果該參數不存在,則返回nullMap<String,String[]>getParameterMap()返回包含所有請求參數的Map<參數名,參數值數組>voidsetAttribute(Stringname,Objecto)在當前request中存儲一個名為name的屬性值oObjectgetAttribute(Stringname)返回當前request中存儲的名為name的屬性值,如果該屬性不存在,則返回nullvoidremoveAttribute(Stringname)刪除當前request中存儲的名為name的屬性Enumeration<String>getAttributeNames()返回包含當前request中所有屬性名稱的枚舉對象StringgetContentType()返回當前請求的MIME類型項目6用戶注冊表單信息獲取及顯示6.2新知識點——JSP內置對象、request(2)request
request對象是JSP內置對象中最常用的對象之一,其主要用于處理客戶端的請求。可以通過該對象的方法來獲取相關數據。其常用方法見表3-2所示。(request對象的方法有很多,其他方法請查閱相關手冊)intgetContentLength()返回請求體的長度(以字節為單位)StringgetCharacterEncoding()返回當前請求的字符編碼方式voidsetCharacterEncoding(Stringencoding)設定請求體的字符編碼方式StringgetRemoteAddr()返回發送此請求的客戶端的IP地址StringgetRemoteHost()返回發送此請求的客戶端的完整主機名StringgetScheme()返回當前請求的發送方式,如http、https及ftpStringgetServerName()獲取接受此請求的服務器的主機名intgetServerPort()獲取接受此請求的端口號StringgetRequestURI()獲取當前request所請求的URIStringgetQueryString()獲取URL后所帶的查詢字符串ServletContextgetServletContext()返回當前request所在的servlet上下文環境,相當于application對象HttpSessiongetSession()獲取與當前請求相關聯的HttpSession對象Cookie[]getCookies()返回瀏覽器隨著此次請求所送的所有Cookie項目6用戶注冊表單信息獲取及顯示6.3擴展——中文亂碼處理、request中其他信息獲取(1)中文亂碼處理在基于JSP的開發過程中,如果處理不當,經常會遇到中文亂碼問題,其中比較常見的是JSP頁面亂碼和客戶端提交給服務器端的中文數據亂碼兩種情形。JSP頁面亂碼通常是由于page指令中的編碼設置不當造成的;而客戶端提交數據亂碼是由于請求體字符編碼設置不當造成的。假如將程序3-1中的page指令改為<%@pagecontentType="text/html"language="java"%>,則頁面將出現如圖3-6(a)所示的結果;如果該指令改為<%@pagecontentType="text/html;charset=UTF-8"language="java"pageEncoding="ISO-8859-1"%>,則頁面將出現如圖3-6(b)所示的結果;而如果將該指令改為<%@pagecontentType="text/html;charset=ISO-8859-1"language="java"pageEncoding="UTF-8"%>,則頁面將出現如圖3-6(c)所示的結果。由此可見,page指令中的pageEncoding和contentType屬性設置不當都會造成中文亂碼。3-6(a)3-6(c)3-6(b)項目6用戶注冊表單信息獲取及顯示6.3擴展——中文亂碼處理、request中其他信息獲取(1)中文亂碼處理當客戶端提交的請求數據中含有中文時,如果沒有為該請求體設置編碼或者編碼設置不當,則服務器端獲得的中文數據將發生亂碼。如將6.1節的表單增加個人簡介后,程序為exam6_reg_2.jsp,其提交后顯示會是亂碼。正是由于服務器端獲得的中文數據已經是亂碼,造成在該顯示注冊信息的結果頁面中顯示的中文呈現亂碼,因此對含有中文的表單數據要進行編碼設置。其主要方法為在獲取程序中設置能支持中文的編碼方式,且使request的字符集與結果頁面字符集保持一致,見程序3-3。
項目6用戶注冊表單信息獲取及顯示6.3擴展——中文亂碼處理、request中其他信息獲取(1)中文亂碼處理程序3-3:exam6_reg_2_do.jsp獲取參數數據代碼片段<%request.setCharacterEncoding(“utf-8”);Stringusername=request.getParameter(“username”);Stringpassword=request.getParameter(“password”);Stringsex=request.getParameter(“sex”);Stringemail=request.getParameter(“email”);String[]lan=request.getParameterValues(“lan”);Stringintro=request.getParameter(“intro”);Stringlans=””;if(lan!=null){ for(inti=0;i<lan.length;i++) { lans=lans+lan[i]+”,”; }}%>項目6用戶注冊表單信息獲取及顯示6.3擴展——中文亂碼處理、request中其他信息獲取(1)中文亂碼處理代碼分析:在程序3-3中,調用request對象的setCharacterEncoding()方法對于request對象的字符集進行設置,使表單用post方式提交中文能正常獲取。因為前后頁面都采用utf-8字符集,所以此處設置字符集為utf-8。設置字符集后,其后邊獲取中文參數都不再是亂碼,運行效果如下圖所示。項目6用戶注冊表單信息獲取及顯示6.3擴展——中文亂碼處理、request中其他信息獲取(2)獲得客戶端請求的相關信息
HttpServletRequest包含很多可以獲取與當前請求相關信息的方法,具體可查看API文檔,下面的例子將展示其中一部分方法的使用,exam6_request.jsp是提交請求的頁面,exam6_showInfo.jsp是處理請求的頁面,在此頁面中將調用request對象的各種方法,以獲取與當前請求相關的一些信息。運行效果如圖3-10、3-11所示。項目6用戶注冊表單信息獲取及顯示6.3擴展——中文亂碼處理、request中其他信息獲取(2)獲得客戶端請求的相關信息說明:圖3-11中獲取的客戶端IP地址和主機名為0:0:0:0:0:0:0:1,這是Ipv6的地址格式,相當于Ipv4的。
exam6_showInfo.jsp的主要代碼見程序3-4。程序3-4:exam6_showInfo.jsp獲取與request相關信息的代碼片段當前請求的MIME類型:<%=request.getContentType()%><br/>請求體的長度:<%=request.getContentLength()%>字節<br/>當前請求的字符編碼方式:<%=request.getCharacterEncoding()%><br/>客戶端的IP地址:<%=request.getRemoteAddr()%><br/>客戶端的完整主機名:<%=request.getRemoteHost()%><br/>客戶端端口號:<%=request.getRemotePort()%><br/>當前請求的發送方式:<%=request.getScheme()%><br/>服務器的主機名:<%=request.getServerName()%><br/>服務器端口號:<%=request.getServerPort()%><br/>當前request所請求的URI:<%=request.getRequestURI()%><br/>項目7處理服務器響應7.1項目描述與實現1.實現四則運算測試功能(1)描述:
針對剛學會整數四則運算的小學生,開發一個測試網站。要求在測試頁面中能隨機產生一個四則運算式,當用戶在userAnswer表單域內填寫答案并提交后,獲取用戶所填的答案,判斷答案的對錯后,如果錯誤則進入錯誤提示頁面;如果正確則進入正確頁面。項目7處理服務器響應答題正確時的頁面答題不正確時的提示頁面7.1項目描述與實現1.實現四則運算測試功能項目7處理服務器響應7.1項目描述與實現1.實現四則運算測試功能(2)實現過程①測試頁面。
在測試頁面exam7_test.jsp中,需要生成一個簡單的四則運算式,即生成兩個操作數和一個操作符,并制作一個表單,將用戶所填的答案傳遞到處理頁面。項目7處理服務器響應程序3-5:exam7_test.jsp<%@pagelanguage=”java”contentType=”text/html;charset=UTF-8”pageEncoding=”UTF-8”%><% Randomrand=newRandom(); inta=rand.nextInt(100);//隨機生成第一個操作數,操作數控制在100以內 intb=rand.nextInt(100);//隨機生成第二個操作數 intoperator=rand.nextInt(4);//生成代表操作符的整數 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項目描述與實現1.實現四則運算測試功能(2)實現過程①測試頁面。項目7處理服務器響應代碼分析:程序3-5中,利用java.util.Random類的nextInt(inta)方法來生成整型隨機數,該方法能夠隨機生成一個[0,a)范圍的整數,為了降低用戶的答題難度,將兩個操作數的范圍都控制在100以內。此外,操作符的產生也是通過產生一個0-3之間的整數,然后將0至3這四個不同的整數值對應成加、減、乘、除這四個操作符。為了在處理頁面中能夠判斷用戶答案的正確性,所以在表單中使用了一個隱藏域<inputtype=”hidden”name=”answer”value=”<%=answer%>”/>將參考答案的值傳遞給相應的action,并使用一個文本域userAnswer來傳遞用戶所填寫的答案。程序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項目描述與實現1.實現四則運算測試功能(2)實現過程①測試頁面。項目7處理服務器響應7.1項目描述與實現1.實現四則運算測試功能注意:在本代碼中,form的提交方式,即method屬性被設置為“get”方式(這是method屬性的默認值,不用顯式設置也可),這是html表單除“post”外的另一種提交方式,這兩種方式的區別是:(1)get方法將form中提交的用戶數據作為查詢字符串附加到action屬性所指定的url后進行傳遞,如程序3-5中的表單某一次提交后的url將會變為”http://localhost:8080/JavaWebExample/chapter3/exam7_test_do.jsp?answer=83&userAnswer=0”,即查詢字符串和URL之間用“?”隔開,每個參數之間用“&”隔開。雖然HTTP協議規范并沒有對URL長度進行限制,但是由于各種瀏覽器和服務器對URL的長度都有自己的長度限定,所以我們在使用get方式提交數據時,要注意其長度不能超出使用瀏覽器的URL長度限制。雖然get方式傳輸的數據量比較小,但執行效率要比post方式高。(2)post方法將表單內的提交數據封裝在html請求體內進行傳遞,傳遞數據大小一般沒有限制,可以傳遞較大的數據量。但是有時為了避免惡意用戶使用大量數據對服務器進行攻擊,服務器也會做相應的限制。項目7處理服務器響應7.1項目描述與實現1.實現四則運算測試功能(2)實現過程②測試結果處理頁面
exam7_test_do.jsp獲取測試頁面傳遞過來的參考答案以及用戶輸入的答案之后,通過對比,判斷出需要跳轉到的結果頁面。程序3-6:exam7_test_do.jsp中<body>標簽內的代碼<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(“您必須輸入整數作為答案!”); }
%></body>項目7處理服務器響應程序3-7:exam7_test_correct.jsp中<body>標簽內的代碼<body><pstyle="font-size:20px;color:blue">
恭喜,答對了!</p><ahref=”exam7_test.jsp”>繼續答題</a></body>7.1項目描述與實現1.實現四則運算測試功能(2)實現過程②測試結果處理頁面程序3-8:exam7_test_error.jsp中<body>標簽內的代碼<body><pstyle="font-size:20px;color:red">
您的答案不正確,正確答案應該是<%=request.getParameter("answer")%>!</p><ahref=”exam7_test.jsp”>繼續答題</a></body>項目7處理服務器響應代碼分析:程序3-6中,獲取請求參數answer和userAnswer后,將其轉換為整型,由于用戶可能會在測試頁面填入其它字符,導致類型轉換出錯而拋出異常,所以此處將所有邏輯代碼放在一個try塊中,即一旦拋出NumberFormatException,便不再繼續執行,而是打印出“您必須輸入整數作為答案!”的提示。對比用戶輸入的答案和參考答案后,如果二者相等,則使用內置對象response的sendRedirect()方法重定向到exam7_test_correct.jsp(代碼如程序3-7所示)頁面;如果不相等,則重定向到錯誤提示頁面exam7_test_error.jsp(代碼如程序3-8所示),且為了在提示頁面中能夠提示用戶正確答案,將參考答案作為URL查詢參數傳遞過去。7.1項目描述與實現1.實現四則運算測試功能(2)實現過程②測試結果處理頁面項目7處理服務器響應7.1項目描述與實現2.定時刷新頁面(1)描述
某些網站,如某些bbs論壇,會定時刷新頁面以便讓讀者及時看到最新的話題。請完成網頁定時刷新任務,即每5秒鐘刷新一次頁面,頁面上需顯示出當前的時間(精確到秒)。項目7處理服務器響應7.1項目描述與實現2.定時刷新頁面(1)實現①創建exam7_showTime.jsp②完成定時刷新功能程序3-9:exam7_showTime.jspbody部分代碼<%@pagelanguage=”java”contentType=”text/html;charset=UTF-8”pageEncoding=”UTF-8”import=”java.util.Date,java.text.SimpleDateFormat”%><body>現在時間:<% //創建Date對象,獲取當前時間 Datedate=newDate(); SimpleDateFormatf=newSimpleDateFormat(“yyyy年MM月dd日hh:mm:ss”); out.println(f.format(date));//設定名為”Refresh”的響應頭,值”5”代表每5秒刷新一次本頁面 response.setHeader(“Refresh”,“5”);%></body>代碼分析:本程序采用response對象的setHeader方法,對于HTTP響應Refresh進行設置,設置為5秒刷新一次當前頁面。項目7處理服務器響應7.2新知識點-responseJSP的內置對象response代表服務器端返回給客戶端的響應,其主要用于處理響應數據。該對象的方法主要包括處理響應頭的相關屬性的方法、設定響應狀態碼的方法、重定向方法、設置響應體相關內容和屬性的方法等。其常用方法見下表所示。方法說明voidsetHeader(Stringname,Stringvalue)為名為name的響應頭設定值為valuebooleancontainsHeader(Stringname)判斷響應對象中是否有名為name的頭voidaddCookie(Cookiecookie)將參數指定的cookie添加到response對象中voidsendRedirect(Stringlocation)將頁面重定向到參數所指定的URLvoidsetContentType(Stringtype)設置響應的MIME類型PrintWritergetWriter()得到返回客戶端的打印流項目7處理服務器響應7.2新知識點-response(1)setHeader方法用來設置響應頭報文。
常用的響應頭屬性有“Content-Type”、“Refresh”、“Expires”等。其中較常用的是“Refresh”屬性,可以用來定時刷新頁面或者定時跳轉到其它頁面。如:response.setHeader(“Refresh”,“5”);表示每5秒刷新一下當前頁面;response.setHeader(“Refresh”,“5;url=a.jsp”);表示5秒后跳轉到a.jsp頁面。(2)sendRedirect方法和<jsp:forward>指令的區別:①sendRedirect方法不僅可以重定向到當前應用程序的其他資源,而且可以跳轉到URL參數指定的其它任何站點的可訪問資源。這種跳轉可以說是一種完全的跳轉,瀏覽器將請求新的URL地址,在地址欄上顯示的是新的URL地址。原頁面和新頁面之間不能共享request數據。②<jsp:forward>指令只能轉發到同一個Web應用程序內的資源,它只是向服務器請求目標地址的資源,服務器將相應的響應資源讀取過來之后發送給瀏覽器,所以在客戶端瀏覽器地址欄中不會顯示出轉向后的地址。轉發頁面和轉發到的頁面可以共享request里面的數據。(3)response對象的其他方法請查閱相關手冊。項目7處理服務器響應7.2新知識點-outout對象是javax.servlet.jsp.JspWriter類的實例,表示一個輸出流,用于向客戶端輸出數據。查閱API文檔可知,JspWriter對象和由ServletResponse的getWriter()方法得到的PrintWriter對象是有依賴關系的。如果頁面沒有緩沖區,那么寫入JspWriter對象的數據將直接通過PrintWriter對象進行輸出;如果頁面有緩沖區,則直到緩沖區滿且如setContentType()等操作都合法時才創建PrintWriter對象,由PrintWrtier對象進行輸出。out對象的常用方法見下表所示。方法說明voidprint(xxxx)向客戶端輸出各種數據類型的數據voidprintln(xxxx)向客戶端輸出各種數據類型的數據,并在最后結束該行voidclear()清空緩沖區。如果執行本操作時緩沖區已經被清空輸出,則拋出IOExceptionvoidclearBuffer()清空緩沖區voidflush()輸出緩沖區中的所有數據并清空緩沖區voidclose()關閉輸出流,關閉前會將緩沖區中的數據輸出。在JSP中無需親自調用此方法,因為JSP容器產生的代碼已經包括了此方法的調用intgetBufferSize()以字節為單位返回緩沖區的大小intgetRemaining()獲取緩沖區中尚未使用的空間的大小booleanisAutoFlush()當緩沖區滿時,是否自動清空緩沖區項目7處理服務器響應7.3擴展-設置響應的MIME類型(1)描述將一個文本文件包含在JSP頁面中,且在顯示頁面內容之前先讓用戶選擇查看文件所使用的方式,將三種可選方式(文本方式、網頁方式、Word文檔方式)放在下拉框中供用戶選擇。當用戶選擇并點擊“查看”按鈕后,按用戶所選方式展現內容。項目7處理服務器響應7.3擴展-設置響應的MIME類型(2)實現①創建一個名為exam7_mimeSetting.jsp的頁面,該頁面包含讓用戶選擇查看文件方式的表單。
程序3-10:exam7_mimeSetting.jsp中<body>標簽內的代碼<body>請選擇查看文件的方式:<formaction=”exam7_mimeSetting_do.jsp”> <selectname=”type”> <optionvalue=”txt”>文本方式</option> <optionvalue=”word”>word文檔</option> <optionvalue=”html”>網頁方式</option> </select> <inputtype=”submit”value=”查看”/></form></body>項目7處理服務器響應7.3擴展-設置響應的MIME類型(2)實現②創建一個名為exam7_mimeSettingTest.txt的文本文檔,與上述的JSP文件放置在同一個文件夾中。項目7處理服務器響應7.3擴展-設置響應的MIME類型(2)實現③創建響應頁面exam7_mimeSetting_do.jsp。程序3-11:exam7_mimeSetting_do.jsp中<body>標簽內的代碼<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”); }
%>文件內容如下:<jsp:includepage=”exam7_mimeSettingTest.txt”></jsp:include></body>項目7處理服務器響應7.3擴展-設置響應的MIME類型(2)實現③創建響應頁面exam7_mimeSetting_do.jsp。代碼分析:程序3-11首先獲取請求參數“type”的值,該值表示用戶所選取的查看文件的方式。當用戶選擇使用網頁形式查看內容時,調用response.setContentType(“text/html;charset=UTF-8”)來將響應的MIME設置為html類型,實際上這種類型是本頁面的默認類型,因為在page指令中已經設定了contentType屬性的值為”text/html;charset=UTF-8”,所以這句代碼去掉也可。當用戶選擇使用普通文本方式查看內容時,將contentType設置為“text/plain”,這樣將會把本頁面的所有內容(包括html標簽)以普通文本的形式全部顯示出來)。當用戶選擇使用word文檔形式查看內容時,將contentType設置為“application/msword”,那么當客戶端接收到此頁面響應時,將會試圖調用客戶端打開word文檔的默認應用程序來顯示此頁面body中所包含的數據。項目7處理服務器響應7.3擴展-設置響應的MIME類型(3)效果①當用戶選擇以網頁形式查看內容,即MIME類型為“text/html”時的響應頁面如圖所示。②當用戶選擇以普通文本方式查看網頁內容時,即MIME類型為“text/plain”時的響應頁面如圖所示。項目7處理服務器響應7.3擴展-設置響應的MIME類型(3)效果③當用戶選擇以word文檔的形式查看該網頁數據時,即MIME類型為“application/msword”時的響應頁面將試圖調用客戶端的word文檔默認程序來打開網頁內容,下圖分別為調用MicrosoftOfficeword程序前的詢問窗口和用戶選擇“打開”后的word窗口。項目8存儲用戶會話8.1項目描述與實現(1)判斷用戶是否已登錄
描述:實現如下功能:用戶成功登錄后,只要未關閉瀏覽器的情況下,可隨時訪問本站點的任何頁面(當然此處本站點只有登錄頁面和歡迎頁面),如果用戶在未登錄的情況下訪問歡迎頁面,則給出相應的提示,并在5秒后跳轉到登錄頁面。項目8存儲用戶會話8.1項目描述與實現(1)判斷用戶是否已登錄
實現過程:程序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>登錄結果</title></head><body><% Stringusername=request.getParameter(“username”); Stringpassword=request.getParameter(“password”); //為了簡化實現,假設用戶名和密碼分別為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秒后為您跳轉回登錄頁面...”); response.setHeader(“refresh”,”5;url=exam8_login.jsp”);}%></body></html>項目8存儲用戶會話8.1項目描述與實現(1)判斷用戶是否已登錄
實現過程:代碼分析:用戶成功登錄后,將用戶名存入session中,意味著只要是同一個用戶,在沒有關閉瀏覽器的情況下,訪問本Web應用的任何頁面,都能通過session識別該用戶。項目8存儲用戶會話8.1項目描述與實現(1)判斷用戶是否已登錄
實現過程:程序3-13:exam8_welcome.jsp部分代碼<body><% //獲取session中名為”username”的對象
ObjectusernameObj=session.getAttribute(“username”); //對象為空,表示用戶并沒有登錄
if(usernameObj==null){ out.println(“您必須先登錄,5秒后為您跳轉回登錄頁面...”); response.setHeader(“refresh”,“5;url=exam8_login.jsp”); }else{ Stringusername=(String)usernameObj; out.println(username+”,歡迎您!”); }%></body>代碼分析:由登錄處理程序3-12可知,當用戶成功登錄后便立即把該用戶的用戶名存入了session對象中,即如果用戶登錄過,且過程中并沒有關閉瀏覽器,那么在訪問本頁面時應能在session對象中獲取到名為“username”的屬性,即程序3-13中的usernameObj不應為null;否則便是沒有登錄,做相應的提示后便跳轉回登錄頁面。用戶沒有登錄,直接訪問exam8_welcome.jsp的效果圖如圖3-22所示。項目8存儲用戶會話8.1項目描述與實現(2)使用application對象制作簡易留言板
描述:制作一個簡易的留言板,當用戶進入留言板頁面(exam8_messageBoard.jsp)時,該頁面顯示所有用戶留言中的最新的十條,該頁面的下方有留言輸入框,當用戶提交留言后,刷新顯示本頁。由于至本章尚未介紹連接數據庫的相關知識,所以本任務不要求將相關數據存入數據庫,而是采用JSP內置的application對象來存儲用戶的留言。留言板頁面的顯示效果如圖3-23所示。主要的設計思路為:將所有的留言信息存入一個List中,而每一條留言信息包括留言的用戶名、留言標題、內容以及時間,將這些項都以字符串的形式表示,然后拼接成一個表示一條留言的字符串,拼接時以分號“;”作為分隔符。每當增加一條用戶留言時,就將新留言信息(即新的字符串對象)添加到List中。為了讓所有用戶都能共享留言信息,所以將上述持有留言的List對象存入application中。項目8存儲用戶會話8.1項目描述與實現(2)使用application對象制作簡易留言板
實現過程:創建名為exam8_messageBoard.jsp的JSP頁面,其內容為留言板主頁的代碼,如程序3-14。程序3-14:留言板主頁exam8_messageBoard.jsp<body>標簽中代碼如下所示:<body><% //從application對象中獲取存儲留言信息的List對象 List<String>msgList=(List<String>)application.getAttribute(“msgList”); if(msgList!=null){ Iterator<String>iter=msgList.iterator(); while(iter.hasNext()){//遍歷留言List,將各條留言顯示在本頁面上 Stringmsg=iter.next(); //以分號作為分隔符將留言的各部分內容拆分出來 String[]splitMsg=msg.split(“;”);%><divclass=”message”> <divclass=”title”>標題:<%=splitMsg[1]%></div> <divclass=”content”><divclass=”author”><%=splitMsg[0]%> 發表于:<%=splitMsg[3]%></div>
內容:<%=splitMsg[2]%></div></div><%}}%><divclass=”writeMsg”> <formaction=”exam8_writeMsg.jsp”method=”post”class=”form1”>
用戶名:<inputtype=”text”name=”username”/><br/>
標題:<inputtype=”text”name=”title”/><br/>
內容:<textareaname=”content”rows=”4”cols=”30”></textarea><br/> <inputtype=”submit”value=”留言”/> </form></div></body>項目8存儲用戶會話8.1項目描述與實現(2)使用application對象制作簡易留言板代碼分析:本程序分為兩個部分,第一部分用來顯示已有留言,第二部分為輸入新留言的輸入框。本例用一個List來持有留言對象,所以顯示留言的第一步便是調用application.getAttribute(Stringname)方法將存放在application對象中的留言List獲取出來,為了預防尚未有留言時msgList為null而產生空指針異常的情況,在遍歷顯示留言之前先用if(msgList!=null)來做限制。當從List中遍歷顯示每一條留言信息時,先將表示留言的String對象以分號“;”作為分隔符進行拆分,依據該String的組成規則“用戶名;標題;內容;留言時間”,分別把拆分出來的字符串數組的各元素顯示在相應的位置上。本頁面所使用的樣式文件可到本書官方網站查看完整源碼,此處不再給出。項目8存儲用戶會話8.1項目描述與實現(2)使用application對象制作簡易留言板
實現過程:
編寫提交留言后的處理邏輯程序,代碼見程序3-15。程序3-15:添加留言的處理邏輯exam8_writeMsg.jsp<body>標簽中代碼如下所示:<body><% request.setCharacterEncoding(“UTF-8”); Stringusername=request.getParameter(“username”); Stringtitle=request.getParameter(“title”); Stringcontent=request.getParameter(“content”); Datetime=newDate(); //將當前請求中包含的留言信息組合到一個字符串中 Stringmsg=username+”;”+title+”;”+content+”;”+time.toString(); List<String>msgList=(List<String>)application.getAttribute(“msgList”); //如果當前application范圍內不存在留言List,則新建一個List if(msgList==null){ msgList=newLinkedList<String>(); } msgList.add(msg);//將新留言添加到留言記錄中 //由于本任務只要求保留最新的10條留言記錄,所以當超出10條留言時,刪除最早的一條 if(msgList.size()>10){ msgList.remove(0); } //將更新過的留言List存入application中 application.setAttribute(“msgList”,msgList); response.sendRedirect(“exam8_messageBoard.jsp”);%></body>項目8存儲用戶會話8.1項目描述與實現(2)使用application對象制作簡易留言板代碼分析:首先獲取由request所提交的用戶名、留言標題、內容信息,以及系統的當前時間,然后將這些內容以分號分隔組合起來存到字符串對象msg中;得到application中持有留言的msgList之后,將msg加入到其中,然后再用這個更新后的msgList覆蓋application中舊的msgList。項目8存儲用戶會話8.2新知識點——session、aplication(1)sessionsession(會話)是用來在訪問一個網站時發出的多個頁面請求或者在多次頁面跳轉之間識別同一個用戶并且存儲這個用戶的相關信息的一種方式。通常從一個客戶連接到某個服務器開始,直到他關閉瀏覽器離開這個服務器為止,稱之為一次會話。Servlet容器使用javax.servlet.http.HttpSession這個接口在HTTP客戶端和服務器端之間創建一個會話,JSP的內置對象session就是這個接口的一個實例。一個session通常只對應一個用戶,它有一定的生存時間,它可以使同一個用戶在訪問同一個Web站點時在多個頁面連接和請求之間共享數據。服務器通常通過cookie或者重寫URL的方式來維持session,不過開發者無需關心這些細節。HttpSession接口的方法主要分為兩類,一類是查看和操作關于這個session的信息的方法,如session的ID、創建時間、最近訪問時間等;另一類方法是將對象綁定到session中,以能夠使用戶信息在客戶端與服務器端的多次連接中能夠共享。Session對象的常用方法如表3-5所示。項目8存儲用戶會話8.2新知識點——session、aplication(1)session
方法說明voidsetAttribute(Stringname,Objectvalue)將對象value綁定到session中,以name作為名字。如果已有名為name的對象與此session綁定,則覆蓋原來的對象。ObjectgetAttribute(Stringname)返回與此session綁定的名為name的對象,如沒有,則返回null。voidremoveAttribute(Stringname)刪除與此session綁定的名為name的對象Enumeration<String>getAttributeNames()以Enumeration對象的形式返回所有與此session綁定的對象的名稱longgetCreationTime()返回此session的創建時間,即創建時距離格林尼治時間的毫秒數StringgetId()返回標識此會話的唯一的ID,此ID是servlet容器賦予的longgetLastAccessedTime()返回最近一次客戶發送請求的時間,以距離格林尼治時間的毫秒數計voidsetMaxInactiveInterval(intinterval)設置客戶端發送請求的最大時間間隔(以秒計),如果超過這個時間客戶端都沒有發送過請求,則使當前session失效。參數的值如果小于等于0的話,意味著session不會自動失效intgetMaxInactiveInterval()返回以秒計的最大不活動時間間隔ServletContextgetServletContext()返回當前session對象所屬的ServletContextvoidinvalidate()使session對象失效,所有與之綁定的對象都解除綁定booleanisNew()判斷當前session對象是否為服務器端新創建的session,還尚未被客戶端所使用項目8存儲用戶會話8.2新知識點——session、aplication(2)applicationJSP內置的application對象是javax.servlet.ServletContext類的一個實例,可以通過它和Servlet容器進行通信,如獲取一個文件的MIME類型,轉發請求,寫日志文件等等;也可以通過它共享一些全局信息。Application對象表示Servlet的上下文,每臺Java虛擬機上的同一個Web應用只有一個上下文,即當Web應用被部署到服務器上,服務器啟動時就創建一個application對象,所有訪問該應用的客戶都共享同一個application對象,直到服務器關閉。因此可以通過將一些信息放在application對象里,以實現全局共享,當然要注意這個“全局”只是相對的,因為不同的Java虛擬機上的Servlet上下文也是不同的。其主要方法如表3-6所示。項目8存儲用戶會話8.2新知識點——session、aplication(2)application方法說明ObjectgetAttribute(Stringname)獲取application中名為name的屬性Enumeration<String>getAttributeNames()返回包含當前application中所有屬性名稱的Enumeration對象voidsetAttribute(Stringname,Objectobject)將指定的對象object與名字name綁定并存入當前application中voidremoveAttribute(Stringname)刪除application中名為name的屬性voidlog(Stringmsg)將指定的消息寫入servlet日志文件中,日志的名稱和類型都是servlet容器已定義好的
voidlog(Stringmessage,Throwablethrowable)將說明性的消息,以及指定的異常的跟蹤棧內容寫到日志文件中,日志的名稱和類型都是servlet容器已定義好的StringgetContextPath()返回當前Web應用的上下文路徑。如本書的例子所在的應用的上下文路徑就是/JavaWebExampleStringgetRealPath(Stringpath)返回參數給定的虛擬路徑所對應的真實文件系統路徑.URLgetResource(Stringpath)返回指定路徑的URLStringgetServerInfo()獲取服務器信息StringgetMimeType(Stringfile)獲取指定文件的MIME類型項目8存儲用戶會話8.3擴展——cookie(1)記錄用戶以往訪問當前站點的相關信息任務描述:當用戶訪問本網站的登錄頁面時,能夠自動顯示出該用戶以前訪問本網站時曾經使用過的用戶名。實現過程:這樣的功能一般都是基于cookie實現的。首先創建一個web應用,當用戶訪問本網站的登錄頁面exam8_cookie_login.jsp(代碼如程序3-16所示)時,該頁面讀取客戶端的cookie,如果cookie中存在username記錄,則在登錄表單的用戶名一欄中自動填入該username值。當用戶成功登錄后,將該username存入cookie中。登錄處理頁面exam8_cookie_login_do.jsp如程序3-17所示。項目8存儲用戶會話8.3擴展——cookie(1)記錄用戶以往訪問當前站點的相關信息程序3-16:exam8_cookie_login.jsp<body>標簽中代碼如下所示:<body><h6>用戶登錄</h6><% Stringusername=””;//準備用來存儲從cookie中讀取的用戶名的變量 Cookie[]cookies=request.getCookies();//獲取客戶端與本站點相關的所有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>項目8存儲用戶會話8.3擴展——cookie(1)記錄用戶以往訪問當前站點的相關信息
程序3-16:exam8_cookie_login.jsp代碼分析:程序3-16中,使用request.getCookies()方法能夠獲取當前客戶端與本站點相關的所有cookie,注意當客戶端沒有相關cookie存在時,此方法返回的參數是null。當遍歷獲取名為username的cookie值后,在名為“username”的表單域中將此值作為其value屬性的值,這樣便可以達到記錄用戶上次使用的登錄名的效果。項目8存儲用戶會話8.3擴展——cookie(1)記錄用戶以往訪問當前站點的相關信息程序3-17:exam8_cookie_login_do.jsp<body>標簽中代碼如下所示:<body><% Stringusername=request.getParameter(“username”); Stringpassword=request.getParameter(“password”); //假設用戶名和密碼分別為tom和123就算登錄成功
if(username!=null&&password!=null&& username.equals(“tom”)&&password.equals(“123”)){ out.println(username+”,歡迎您!”); //創建一個名為username的cookie Cookiec=newCookie(“username”,username); //設置該cookie的最長保留時間為30天
c.setMaxAge(60*60*24*30); //將該cookie添加到reponse對象中發到客戶端
//如果該客戶端已經存在同名cookie,則新的cookie將覆蓋原有的cookie response.addCookie(c); }else{ out.println(“登錄出錯!”); }%></body>項目8存儲用戶會話8.3擴展——cookie(1)記錄用戶以往訪問當前站點的相關信息代碼分析:由于到本章為止尚未介紹訪問數據庫的知識,所以登錄功能只作簡單實現,暫不涉及訪問數據庫數據,即假設用戶名和密碼分別為“tom”和“123”便算登錄成功。當登錄成功時,使用out對象的println方法直接在本頁打印出歡迎語句;且將當前的用戶名添加到一個名為username的cookie中,使用response對象的addCookie方法即可將該cookie發送到客戶端,以備下一次登錄時能夠自動檢測到用戶名。當在cookie的有效期內再次訪問登錄頁面時,登錄頁面將直接把上次的登錄名“tom”顯示在用戶名輸入框內,效果如圖3-24所示。項目8存儲用戶會話8.3擴展——cookie(2)知識點:Cookie簡介Cookie是Web服務器發送給客戶端的一小段信息。如果服務器需要在客戶端記錄某些數據時,就可以向客戶端發送Cookie,客戶端接收并保存該Cookie,而且客戶端每次訪問該服務器上的頁面時就會將Cookie隨請求數據一同發送給服務器。下面從向客戶端發送Cookie以及從客戶端讀取Cookie兩方面來介紹Cookie的使用方法。(1)向客戶端發送Cookie首先需要創建Cookie對象:Cookiec=newCookie(“cookieName”,“cookieValue”);然后需要調用setMaxAge(longtime)為Cookie對象設置有效時間(該時間參數以秒為單位),不然瀏覽器關閉時Cookie就會被刪除;最后使用HttpServletResponse對象的addCookie(Cookiec)方法把Cookie對象添加到HTTP響應頭中發送到客戶端
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 開式、閉式泵的工作原理和調試方法
- 交通勸導面試題及答案
- 2025年 廣西高校畢業生“三支一扶”計劃招募考試試卷附答案
- 手工香皂產品營銷活動
- 治未病科健康宣教課件
- 認識自己小學心理健康
- 2025年中國女士格子襯衫行業市場全景分析及前景機遇研判報告
- 學校安全教育匯報材料
- 《數智時代下的供應鏈管理:理論與實踐》課件 第二章 供應鏈管理焦點與核心理念
- 卷材車間技師培訓
- ISO15614-1 2017 金屬材料焊接工藝規程及評定(中文版)
- 抖音來客商家門店經營
- 術后鎮痛慢性疼痛癌性疼痛診療標準規范及作業流程
- 2022AHA-ACC-HFSA心衰管理指南解讀
- 智慧能源管理云平臺方案智慧能源綜合服務方案智慧能源管理系統方案38-82
- 云計算和邊緣計算在工業互聯網中的融合
- 24年海南生物會考試卷
- 中南大學學科發展與規劃處
- 高危孕產婦管理課件培訓
- 天一大聯考海南省2024屆高一物理第二學期期末考試試題含解析
- 夏季駕駛員安全培訓
評論
0/150
提交評論