引言:JavaWeb中有多種方式實(shí)現(xiàn)JSP/Servlet頁(yè)面之間的跳轉(zhuǎn)與數(shù)據(jù)共享,每種方式有各自的特點(diǎn),在實(shí)際編程過程中需要根據(jù)具體的場(chǎng)景選擇最合適的方式進(jìn)行跳轉(zhuǎn)或者數(shù)據(jù)共享。
一、引言
在JavaWeb編程中間經(jīng)常出現(xiàn)需要從一個(gè)JSP/Servlet頁(yè)面跳轉(zhuǎn)到另外一個(gè)JSP/Servlet頁(yè)面并且在這多個(gè)不同頁(yè)面之間共享數(shù)據(jù)信息的情況,如何選擇跳轉(zhuǎn)方式以及共享數(shù)據(jù)方式一直是JavaWeb編程初學(xué)者容易迷茫的地方。
二、跳轉(zhuǎn)的方式
JavaWeb的跳轉(zhuǎn)分兩種方式:重定向和轉(zhuǎn)發(fā)。重定向是被請(qǐng)求的JSP/Servlet頁(yè)面向客戶端IE響應(yīng)一個(gè)重定向狀態(tài)碼以及,轉(zhuǎn)自[星論文網(wǎng)]www.starlunwen.net重定向路徑后,客戶端IE根據(jù)響應(yīng)內(nèi)容自動(dòng)的向重定向路徑發(fā)送一個(gè)新的請(qǐng)求,重定向路徑的資源接收到請(qǐng)求后執(zhí)行完畢將結(jié)果響應(yīng)給客戶端IE。轉(zhuǎn)發(fā)是被請(qǐng)求的JSP/Servlet頁(yè)面代碼通過RequestDispatcher對(duì)象將當(dāng)前請(qǐng)求直接在服務(wù)器上轉(zhuǎn)交給新的目標(biāo)路徑,由目標(biāo)路徑資源執(zhí)行完畢將結(jié)果響應(yīng)給客戶端IE。
例如客戶端IE請(qǐng)求資源A,資源A跳轉(zhuǎn)到資源B,最終客戶端看到資源B的內(nèi)容。如果是在轉(zhuǎn)發(fā)模式下,客戶端IE向資源A發(fā)出的請(qǐng)求,直到資源B響應(yīng)才結(jié)束,整個(gè)過程只有一次請(qǐng)求響應(yīng)。如果是在重定向模式下,客戶端IE向資源A發(fā)送一個(gè)請(qǐng)求信息,當(dāng)資源A響應(yīng)客戶端重定向狀態(tài)碼時(shí)第一次請(qǐng)求就結(jié)束了,然后客戶端IE向資源B發(fā)出第二次請(qǐng)求,資源B進(jìn)行第二次響應(yīng),整個(gè)過程有兩次請(qǐng)求響應(yīng)。默認(rèn)情況下重定向的第二次請(qǐng)求不含有任何第一次請(qǐng)求用戶輸入的參數(shù)。
三、數(shù)據(jù)共享的方式
通過重定向或者轉(zhuǎn)發(fā)能夠在不同的JSP/Servlet頁(yè)面之間跳轉(zhuǎn),在這些跳轉(zhuǎn)頁(yè)面之間經(jīng)常需要使用一些共享數(shù)據(jù),JavaWeb提供了四種常用的方式來實(shí)現(xiàn)數(shù)據(jù)共享,分別是使用Cookie對(duì)象、HttpSession對(duì)象、ServletContext對(duì)象和HttpServletRequest對(duì)象。這四種方式雖然都能實(shí)現(xiàn)頁(yè)面之間數(shù)據(jù)共享,但是各自又有不同的特點(diǎn):
(一)使用Cookie對(duì)象時(shí),會(huì)生成Cookie數(shù)據(jù)保存在客戶端電腦,客戶端IE每次請(qǐng)求服務(wù)器資源時(shí)會(huì)將Cookie內(nèi)容跟隨請(qǐng)求對(duì)象一起發(fā)送到服務(wù)器,因此服務(wù)器上的JSP/Servlet頁(yè)面都能夠通過請(qǐng)求對(duì)象進(jìn)行Cookie內(nèi)容的訪問,從而實(shí)現(xiàn)數(shù)據(jù)共享。
(二)HttpSession對(duì)象存在于服務(wù)器內(nèi)存,每個(gè)客戶端的session是獨(dú)立的。在客戶端通過Cookie保存一個(gè)唯一的SessionId,每次請(qǐng)求時(shí)IE將這個(gè)SessionId跟隨請(qǐng)求一起交給服務(wù)器,服務(wù)器根據(jù)SessionId找到這個(gè)客戶端私有的HttpSession對(duì)象,同一個(gè)客戶端在不同的JSP/Servlet頁(yè)面都可以對(duì)自己的HttpSession對(duì)象進(jìn)行訪問,通過調(diào)用HttpSession的setAttribute()和getAttribute()方法實(shí)現(xiàn)數(shù)據(jù)共享。
(三)ServletContext對(duì)象存在于服務(wù)器內(nèi)存,任何JSP/Servlet頁(yè)面都能夠?qū)ervletContext對(duì)象進(jìn)行訪問,并且所有客戶端訪問的ServletContext對(duì)象是相同的,通過對(duì)ServletContext對(duì)象進(jìn)行訪問,通過調(diào)用ServletContext的setAttribute()和getAttribute()方法實(shí)現(xiàn)數(shù)據(jù)共享可以實(shí)現(xiàn)數(shù)據(jù)共享。
(四)HttpServletRequest對(duì)象在一次請(qǐng)求期間可以被傳遞給多個(gè)JSP/Servlet頁(yè)面,這些頁(yè)面可以通過調(diào)用HttpServletRequest的setAttribute()和getAttribute()方法實(shí)現(xiàn)數(shù)據(jù)共享。
四、如何選擇合適的方式
數(shù)據(jù)共享的方式有很多種,選擇哪種方式進(jìn)行數(shù)據(jù)共享就是一個(gè)需要斟酌的問題,下面是筆者總結(jié)的一些經(jīng)驗(yàn):
(一)如果希望這個(gè)數(shù)據(jù)在關(guān)閉客戶端IE甚至是電腦后再次訪問服務(wù)器時(shí)還能使用,通過Cookie對(duì)象進(jìn)行數(shù)據(jù)共享。典型的應(yīng)用場(chǎng)景如保存用戶的登錄信息進(jìn)行自動(dòng)登錄驗(yàn)證、保存用戶的偏好設(shè)置等。
(二)如果希望這個(gè)數(shù)據(jù)多次請(qǐng)求之間所有用戶訪問的結(jié)果相同,通過Servlet Context對(duì)象進(jìn)行數(shù)據(jù)共享。典型的應(yīng)用場(chǎng)景如在線用戶列表的顯示、聊天室的聊天信息傳遞等。
(三)如果這個(gè)數(shù)據(jù)希望在多次請(qǐng)求之間共享,并且每個(gè)用戶的數(shù)據(jù)私有,通過HttpSession對(duì)象進(jìn)行數(shù)據(jù)共享。典型的應(yīng)用場(chǎng)景如保存用戶驗(yàn)證信息在不同的頁(yè)面顯示。
(四)如果這個(gè)數(shù)據(jù)只有一次請(qǐng)求響應(yīng)過程有效,通過HttpServletRequest對(duì)象進(jìn)行數(shù)據(jù)共享。典型的應(yīng)用場(chǎng)景如關(guān)鍵字查詢、信息列表顯示、用戶信息查看等,基本上只要和查有關(guān)的都是通過HttpServletRequest對(duì)象。
另外對(duì)于跳轉(zhuǎn)的兩種方式如何選擇,基本上只要有通過HttpServletRequest對(duì)象進(jìn)行數(shù)據(jù)共享的頁(yè)面之間都需要使用轉(zhuǎn)發(fā)方式,因?yàn)橹囟ㄏ蚍绞綍?huì)產(chǎn)生一個(gè)新的請(qǐng)求將原有信息丟失。
五、結(jié)束語(yǔ)
本文對(duì)JavaWeb中頁(yè)面之間的跳轉(zhuǎn)和數(shù)據(jù)共享方式進(jìn)行了對(duì)比闡述,希望能夠解決初學(xué)者在學(xué)習(xí)這部分內(nèi)容時(shí)心中的疑惑。在實(shí)際開發(fā)中還需要讀者根據(jù)實(shí)際情況進(jìn)行分析,舉一反三來選擇最合適的方式。
參考文獻(xiàn)
[1]Marty Hall.Servlet與JSP權(quán)威指南[M].北京:機(jī)械工業(yè)出版社,2002.
[2]Hans Bergsten.JavaServer Pages,Third Edition[M].北京:中國(guó)電力出版社,2004.
[3]孫鑫.Java Web開發(fā)詳解[M].北京:電子工業(yè)出版社,2006.