1. 程式人生 > >Servlet的四大域物件

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內建的九個物件之一,可以直接用。
常用方法:

  1. request.setAttribute();

  2. request.getAttribute();

  3. request.getParameter();

注意傳值的時候總是根據鍵值對傳值

1.生命週期:

在Service方法呼叫前由伺服器建立,傳入service方法。整個請求結束,request生命結束。

使用者傳送一個請求,開始,伺服器返回響應,請求結束,生命週期結束;

2.作用範圍:整個請求鏈(請求轉發也存在)

3.作用:在整個請求鏈中共享資料,經常用到:在servlet中處理好的資料交給JSP顯示,此時引數就可以放在Request域中。

三、session

session會話,他的作用範圍只是對一次會話有效,例如打開了一個瀏覽器訪問網址,當你再開啟另一個瀏覽器的時候就是兩次會話了,當你關閉瀏覽器的時候本次會話就結束了,這次會話的session也就失效了,一次會話只對應一個session。

用法:有時我們要在兩個Servlet之間進行傳值,用session比較方便,還有就是當用戶登入之後,伺服器記下這個session鍵值對,那麼本次會話使用者就不用二次登入了

常用方法:

  1. session.setAttribute();

  2. 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在伺服器關閉的時候銷燬

常用方法:

  1. application.setAttribute("key", value);

  2. 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(),直接返回資源的真實路徑,沒有更新延遲的問題。