1. 程式人生 > >不得不瞭解的四大作用域:application,session,request,page

不得不瞭解的四大作用域:application,session,request,page

首先要宣告一點,所謂"作用域"就是"資訊共享的範圍",也就是說一個資訊能夠在多大的範圍內有效。

Web互動的最基本單位為HTTP請求。每個使用者從進入網站到離開網站這段過程稱為一個HTTP會話,一個伺服器的執行過程中會有多個使用者訪問,就是多個HTTP會話。

一、application

Application 的作用範圍在伺服器一開始執行服務,到伺服器關閉為止Application 的範圍最、停留的時間也最久,所以使用時要特別注意不然可能會造成伺服器負載越來越重的情況。只要將資料存入application物件,資料的範圍範圍 (Scope) 就為Application。

具有application

範圍的物件被繫結到javax.servlet.ServletContext中。Web應用程式執行期間,所有的頁面都可以訪問在這個範圍內的物件。

application物件的主要方法:

1、 getAttribute(String name)     return Object     

2、 getAttributeNames()             return Enumeration

3、 getInitParameter(String name)

4、 getServletInfo()

5、 setAttribute(String name , Object object)

二、session  !!!

HTTP會話開始到結束這段時間。Session 的作用範圍為一段使用者持續和伺服器所連線的時間,但與服務器斷線,這個屬性就無效了。

Session 的開始時刻比較容易判斷,它從瀏覽器發出第一個HTTP請求即可認為會話開始。但結束時刻就不好判斷了,因為瀏覽器關閉時並不會通知伺服器,所以只能通過如下這種方法判斷:如果一定的時間內客戶端沒有反應,則認為會話結束。Tomcat的預設值為120分鐘,但這個值也可以通過HttpSessionsetMaxInactiveInterval()方法來設定。

具有session範圍的物件被繫結到javax.servlet.http.HttpSession物件中。

Session物件的主要方法:

1 getAttribute(String name) return Object

2 getAttributeNames()return Enumeration

3 getCreationTime()return long

4 getId()return String

5 getLastAccessedTime() return long

6getMaxInactiveInterval() return int

7removeAttribute(String name) void

8 setAttribute(String name , java.lang.Object value) void 

三、requset !!!

HTTP請求開始到結束這段時間。Request 的範圍是指在一JSP 網頁發出請求到另一個JSP 網頁之間,否則這個屬性就失效。一個HTTP請求的處理可能需要多個Servlet合作,而這幾個Servlet之間可以通過某種方式傳遞資訊,但這個資訊在請求結束後就無效了。具有request範圍的物件被繫結到javax.servlet.ServletRequest物件中。

要注意的是,因為請求物件對於每一個客戶請求都是不同的,所以對於每一個新的請求,都要重新建立和刪除這個範圍內的物件。

request物件的主要方法:

1getParameter(String name) return String

2 getParameterNames() return Enumeration

3getParameterValues(String name) return String[]

四、page

作用範圍:當前頁面從開啟到關閉這段時間,它只能在同一個頁面中有效。

具有page範圍的物件被繫結到javax.servlet.jsp.PageContext物件中。

五、升級

requestpage的生命週期都是短暫的,它們之間的區別:一個request可以包含多個page頁(includeforwardfilter

為了避免與Servlet API耦合在一起,方便Action類做單元測試,Struts 2HttpServletRequestHttpSessionServletContext進行了封裝,構造了三個Map物件來替代這三種物件,Action中,直接使用HttpServletRequestHttpSessionServletContext對應的Map物件來儲存和讀取資料。

要獲取這三個Map物件,可以使用com.opensymphony.xwork2.ActionContext類,ActionContextaction執行的上下文,在ActionContext中儲存了action執行所需的一組物件,包括parametersrequestsessionapplicationlocale等。

ActionContext類定義瞭如下方法,用於獲取HttpServletRequestHttpSessionServletContext對應的Map物件。

public Object get(Object key)

ActionContext類沒有提供類似getRequest()這樣的方法來獲取封裝了HttpServletRequest的Map物件。要得到請求Map物件,你需要為get()方法傳遞引數“request”。

public Map getSession()

獲取封裝了HttpSessionMap物件。

public Map getApplication()

獲取封裝了ServletContextMap物件。

例:通過ActionContext來獲取request、session和application物件的LoginAction1

package action;

ActionContext context =ActionContext.getContext();

Map request =(Map)context.get("request");

Map session = context.getSession();

Map application = context.getApplication()

request.put("greeting", "歡迎您來到程式設計師之家");

session.put("user", user);

在成功頁面中,可以使用JSP內建的表示式語言來訪問requestsession。、

下面我們通過幾個簡單的例子,來看一下這4種範圍物件的應用。

1.測試page範圍

test1.jsp

<%

pageContext.setAttribute("name","zhangsan");

out.println("test1.jsp: ");

out.println(pageContext.getAttribute("name"));

out.println("<p>");

pageContext.include("test2.jsp");

%>

test2.jsp

<%

out.println("test2.jsp: ");

out.println(pageContext.getAttribute("name"));

%>

訪問test1.jsp,將看到如下的輸出:

test1.jsp: zhangsan

test2.jsp: null

說明儲存在pageContext物件中的屬性具有page範圍,只能在同一個頁面中被訪問

2.測試request範圍

修改test1.jsptest2.jsp,如下所示。

test1.jsp

<%

request.setAttribute("name","zhangsan");

out.println("test1.jsp: ");

out.println(request.getAttribute("name"));

out.println("<p>");

pageContext.include("test2.jsp");

%>

test2.jsp

<%

out.println("test2.jsp: ");

out.println(request.getAttribute("name"));

%>

訪問test1.jsp,將看到如下的輸出:

test1.jsp: zhangsan

test2.jsp: zhangsan

說明儲存在request物件中的屬性具有request範圍,在請求物件存活期間,可以訪問這個範圍內的物件。

pageContext.include("test2.jsp"); 這一句註釋起來,先訪問test1.jsp,再訪test2.jsp,可以看到如下輸出:

test2.jsp: null

這是因為客戶端開始了一個新的請求。

3.測試session範圍

修改test1.jsptest2.jsp,如下所示。

test1.jsp

<%

session.setAttribute("name","zhangsan");

%>

test2.jsp

<%

out.println("test2.jsp: ");

out.println(session.getAttribute("name"));

%>

先訪問test1.jsp,然後在同一個瀏覽器視窗中訪問test2.jsp,可以看到如下輸出:

test2.jsp: zhangsan

說明儲存在session物件中的屬性具有session範圍,在會話期間,可以訪問這個範圍內的物件。

如果我們在訪問完test1.jsp後,關閉瀏覽器,重新開啟瀏覽器視窗,訪問test2.jsp,將看到如下輸出:

test2.jsp: null

這是因為客戶端與伺服器開始了一次新的會話。

4.測試application範圍

修改test1.jsptest2.jsp,如下所示。

test1.jsp

<%

application.setAttribute("name","zhangsan");

%>

test2.jsp

<%

out.println("test2.jsp: ");

out.println(application.getAttribute("name"));

%>

先訪問test1.jsp,然後關閉瀏覽器,再開啟瀏覽器視窗,訪問test2.jsp,可以看到如下輸出:

test2.jsp: zhangsan

說明儲存在application物件中的屬性具有application範圍,在Web應用程式執行期間,都可以訪問這個範圍內的物件。