備注
這里只是簡(jiǎn)單區(qū)別每組概念,不作具體代碼演示。
請(qǐng)求重定向和請(qǐng)求轉(zhuǎn)發(fā)
首先介紹下兩種行為:
請(qǐng)求重定向:客戶端行為,本質(zhì)上來(lái)說相當(dāng)于兩次請(qǐng)求,因此前一次的請(qǐng)求對(duì)象不會(huì)保存,并且URL地址會(huì)改變。代碼實(shí)現(xiàn):response.sendRedirect()
請(qǐng)求轉(zhuǎn)發(fā):服務(wù)器行為,本質(zhì)上是一次請(qǐng)求,因此前一次的請(qǐng)求對(duì)象會(huì)保存,并且URL地址不會(huì)改變。代碼實(shí)現(xiàn):request.getRequestDispatcher().forward(request,response)
那兩者到底有什么區(qū)別呢?舉個(gè)生活中的例子:
小明同學(xué)想向?qū)W校申請(qǐng)借教室,于是他填好了申請(qǐng)表,來(lái)到了招生辦申請(qǐng),但招生辦的老師說:“同學(xué),我們這里不負(fù)責(zé)借教室哦,你想借教室的話要去找教務(wù)處?!毙∶髦缓秒x開招生辦,去找教務(wù)處再填一次申請(qǐng)表,再申請(qǐng)一次,這就是請(qǐng)求重定向。
小強(qiáng)同學(xué)同樣想申請(qǐng)借教室,他也是填好了申請(qǐng)表來(lái)到了招生辦申請(qǐng),但這次招生辦的老師比較熱心:“同學(xué)你把申請(qǐng)表給我,在外面等一下吧,我?guī)湍阆蚪虅?wù)處申請(qǐng),你就不用再走一趟了。”這就是請(qǐng)求轉(zhuǎn)發(fā)。
這里小明和小強(qiáng)好比是客戶端,學(xué)校好比是服務(wù)器,而申請(qǐng)表中的申請(qǐng)資料則好比是請(qǐng)求對(duì)象。小明向招生辦申請(qǐng)借教室和向教務(wù)處申請(qǐng)是兩個(gè)不同的請(qǐng)求,要填兩次申請(qǐng)表,因此前一次的請(qǐng)求對(duì)象不會(huì)被保存,就像第一次的申請(qǐng)表已經(jīng)作廢了,小明又要再填一次申請(qǐng)表,而小明自己又跑了一趟,去到了教務(wù)處,所以請(qǐng)求重定向是客戶端行為,并且URL地址發(fā)生了改變。
小強(qiáng)則不同,招生辦的老師幫他完成了向教務(wù)處的申請(qǐng),申請(qǐng)資料也是直接挪用申請(qǐng)表上的,小強(qiáng)不需要在填寫一次申請(qǐng)表,因此這兩次實(shí)際上是一次請(qǐng)求,小強(qiáng)也沒有離開招生辦,因此請(qǐng)求轉(zhuǎn)發(fā)是服務(wù)器行為,URL地址不會(huì)改變。
Session和Cookie
共同點(diǎn):
- 都是用來(lái)保存用戶狀態(tài)和用戶信息的機(jī)制
- 都有生存期限,即都會(huì)過期
區(qū)別:
- 保存位置:session保存在服務(wù)器(的內(nèi)存),cookie以文本文件的形式保存在客戶端
- 數(shù)據(jù)類型:session中保存的是Object類型(任意數(shù)據(jù)類型),cookie中保存的是String類型(字符串類型)
- 銷毀時(shí)間:session會(huì)隨會(huì)話的結(jié)束而銷毀,cookie則會(huì)長(zhǎng)期保存在客戶端 (當(dāng)然cookie也是有生存期限的)
- 作用:session保存重要的、安全性較高的信息,cookie保存相對(duì)不重要、安全性不高的信息(比如用戶的瀏覽記錄、搜索記錄等信息)
總的來(lái)說,session的安全性比cookie要高。
Iuclude指令和Include動(dòng)作
- include指令代碼為:
<%@ include file="..." %>,include動(dòng)作代碼為:<jsp:include page="..."> - include指令作用在頁(yè)面轉(zhuǎn)換期間,include動(dòng)作作用在請(qǐng)求期間
- include指令會(huì)將包含頁(yè)面的JSP代碼插入其中,而 include動(dòng)作只將包含頁(yè)面的輸出包含進(jìn)來(lái)
- 使用include指令,主頁(yè)面和包含頁(yè)面會(huì)轉(zhuǎn)換為一個(gè)Servlet,而使用include動(dòng)作,主頁(yè)面和包含頁(yè)面會(huì)轉(zhuǎn)換為兩個(gè)獨(dú)立的Servlet
include指令的優(yōu)點(diǎn)在于其功能強(qiáng)大,所包含的代碼可以含有總體上影響主頁(yè)面的JSP構(gòu)造,比如屬性、方法的定義和文檔類型的設(shè)定。而由于只包含輸出,并非頁(yè)面的實(shí)際代碼,因此include動(dòng)作包含的頁(yè)面不能使用任何有可能在整體上影響主頁(yè)面的JSP構(gòu)造。
然而include指令的缺點(diǎn)是難以維護(hù),只要被包含的頁(yè)面發(fā)生更改,就必須更改主頁(yè)面,這是因?yàn)橹黜?yè)面不會(huì)自動(dòng)地查看被包含的頁(yè)面是否發(fā)生更改。而使用include動(dòng)作則無(wú)需對(duì)主頁(yè)面進(jìn)行更改,因此include動(dòng)作比include指令在維護(hù)上有著明顯優(yōu)勢(shì)。
include指令是將源文件與include添加的文件一起編譯成一個(gè)servlet,因此執(zhí)行速度相比起include動(dòng)作來(lái)說稍快一些。但如果頁(yè)面經(jīng)常變化的話,使用include動(dòng)作只需要單獨(dú)編譯主頁(yè)面或者包含頁(yè)面就行,這樣一來(lái)效率比起使用include指令會(huì)更高。
參考資料: