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