Servlet的四大域物件
我們在開發javaweb專案的時候,經常會遇到jsp和Servet之間互相傳值,既然有傳值,就要有物件來傳,這裡先說Servlet的三大域物件,request,session,application他們共同的特點都是通過鍵值對傳值,這樣也很好理解,鍵是唯一的,通過鍵可以找到值。
根據有作用範圍由小到大:
page(jsp有效)------》page域指的是pageContext.
request(一次請求)---》request域request HttpServletContext
session(一次會話)---》session域session HttpSession
application(當前web應用)---》application域指的是application ServletContext;
之所以他們是域物件,原因是他們都內建了map集合,都有setAttribute和getAttribute方法。
一、PageContext域
1
.生命週期:當對JSP的請求開始,當相應結束時銷燬。
jsp頁面被執行,宣告週期開始;
jsp頁面執行完畢,宣告週期結束;
2
.作用範圍:整個JSP頁面,是四大作用域中最小的一個。
3
.作用:
(
1
)獲取其它八大隱式物件,可以認為是一個入口物件。
(
2
)獲取其所有域中的資料
pageContext 操作所有域中屬性的方法
public
java.lang.Object getAttribute(java.lang.String name,
int
scope)
public
void
setAttribute(java.lang.String name, java.lang.Object value,
int
scope)
public
void
removeAttribute(java.lang.String name,
int
scope)
pageContext 中代表域的常量
PageContext.APPLICATION_SCOPE
PageContext.SESSION_SCOPE
PageContext.REQUEST_SCOPE
PageContext.PAGE_SCOPE
findAttribute方法,在四大域中搜尋屬性,搜尋的順序是page域、request域、session域、application域,從小域到大域開始搜尋,如果搜尋到就直接獲取該值,如果所有域中都找不到,返回一個
null
(與el表示式不同,此處返回
null
,對網頁是不友好的)
(
3
)跳轉到其他資源 其身上提供了forward和include方法,簡化重定向和轉發的操作
二、request
request漢譯為請求需求,request代表的只是一次請求,當你點選一個連結,這就是一次請求,request只是一次請求有效,當你在跳轉一次的時候和上一次就不是一次請求了。記住一句話, 一次請求就是一個request,只對當前請求有效。
用法:用於一次請求之間的值的傳遞,在jsp頁面設定有name屬性的表單,在Servlet通過request物件獲取屬性值,注意request是jsp內建的九個物件之一,可以直接用。
常用方法:
-
request.setAttribute();
-
request.getAttribute();
-
request.getParameter();
注意傳值的時候總是根據鍵值對傳值
1
.生命週期:
在Service方法呼叫前由伺服器建立,傳入service方法。整個請求結束,request生命結束。
使用者傳送一個請求,開始,伺服器返回響應,請求結束,生命週期結束;
2
.作用範圍:整個請求鏈(請求轉發也存在)
3
.作用:在整個請求鏈中共享資料,經常用到:在servlet中處理好的資料交給JSP顯示,此時引數就可以放在Request域中。
三、session
session會話,他的作用範圍只是對一次會話有效,例如打開了一個瀏覽器訪問網址,當你再開啟另一個瀏覽器的時候就是兩次會話了,當你關閉瀏覽器的時候本次會話就結束了,這次會話的session也就失效了,一次會話只對應一個session。
用法:有時我們要在兩個Servlet之間進行傳值,用session比較方便,還有就是當用戶登入之後,伺服器記下這個session鍵值對,那麼本次會話使用者就不用二次登入了
常用方法:
-
session.setAttribute();
-
session.getAttribute();
在用上面的方法的時候先要獲取session物件,在jsp頁面中session屬於九大內建物件,可以直接拿來用,在Servlet中必須先要獲取session物件通過
HttpSession session = request.getSession();
在jsp頁面直接拿來
<%session.serAttribute("key",value)%>
session物件進行傳值也是通過鍵值對,鍵的值是唯一的
1
.生命週期:
在第一次呼叫request.getSession()方法時,伺服器會檢查是否已經有對應的session,如果沒有就在記憶體中建立一個session並返回。
(
1
)當一段時間內session沒有被使用(預設為
30
分鐘),則伺服器會銷燬該session。
(
2
)如果伺服器非正常關閉,沒有到期的session也會跟著銷燬。
(
3
)如果呼叫session提供的invalidate(),可以立即銷燬session。
使用者開啟瀏覽器訪問,建立session(開始),session超時或者被宣告失效,該物件生命週期結束;
2
.作用範圍:一次會話。
HttpSession 在伺服器中,為瀏覽器建立獨一無二的記憶體空間,在其中儲存會話相關的資訊
注意:伺服器正常關閉,再啟動,Session物件會進行鈍化和活化操作。同時如果伺服器鈍化的時間在session 預設銷燬時間之內, 則活化後session還是存在的。否則Session不存在。 如果JavaBean 資料在session鈍化時,沒有實現Serializable 則當Session活化時,會消失。
四、application
這個物件的範圍比較大,他是作用於整個服務端,在你啟動伺服器建立application物件設定值,之後在本專案中都可以獲取到,一個專案中只有一個物件,傳值的時候根據鍵的不同區分,application在伺服器關閉的時候銷燬,
常用方法:
-
application.setAttribute("key", value);
-
application.getAttribute("key");
注意在Servlet中也是要獲取application物件的,通過下面這句獲取
ServletContext application = request.getServletContext();
ServletContext也是屬於JSP九大內建物件之一,故可以直接使用。
1
.生命週期:
當WEB應用被載入進容器建立代表整個WEB應用的ServletContext物件;
當伺服器關閉或WEB應用被移除時,ServletContext物件跟著被銷燬。
2
.作用範圍:整個WEB應用。
3
、作用:
a)在不同Servlet 之間轉發
this
.getServletContext().getRequestDispatcher(
"/servlet/Demo10Servlet"
).forward(request,response);
方法執行結束,service就會返回到伺服器,再有伺服器去呼叫目標servlet,其中request會重新建立,並將之前的request的資料拷貝進去。
b)讀取資原始檔。
1
、由於相對路徑預設相對的是java虛擬機器啟動的目錄,所以我們直接寫相對路徑將會是相對於tomcat/bin目錄,所以是拿不到資源的。如果寫成絕對路徑,當專案釋出到其他環境時,絕對路徑就錯了。
為了解決這個問題ServletContext提供了:
this
.getServletContext().getRealPath(
"/1.properties"
),給進一個資源的虛擬路徑,將會返回該資源在當前環境下的真實路徑。
this
.getServletContext().getResourceAsStream(
"/1.properties"
),給一個資源的虛擬路徑返回到該資源真實路徑的流。
2
、當在非servlet下獲取資原始檔時,就沒有ServletContext物件用了,此時只能用類載入器
classLoader.getResourceAsStream(
"../../1.properties"
),此方法利用類載入器直接將資源載入到記憶體中,有更新延遲的問題,以及如果檔案太大,佔用記憶體過大。
classLoader.getResource(
"../1.properties"
).getPath(),直接返回資源的真實路徑,沒有更新延遲的問題。