不得不瞭解的四大作用域:application,session,request,page
首先要宣告一點,所謂"作用域"就是"資訊共享的範圍",也就是說一個資訊能夠在多大的範圍內有效。
Web互動的最基本單位為HTTP請求。每個使用者從進入網站到離開網站這段過程稱為一個HTTP會話,一個伺服器的執行過程中會有多個使用者訪問,就是多個HTTP會話。
一、application
Application
的作用範圍在伺服器一開始執行服務,到伺服器關閉為止Application
的範圍最、停留的時間也最久,所以使用時要特別注意不然可能會造成伺服器負載越來越重的情況。只要將資料存入application物件,資料的範圍範圍 (Scope)
就為Application。
具有application
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分鐘,但這個值也可以通過HttpSession的setMaxInactiveInterval()方法來設定。
具有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
6、 getMaxInactiveInterval() return int
7、removeAttribute(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物件的主要方法:
1、getParameter(String name) return String
2、 getParameterNames() return Enumeration
3、getParameterValues(String name) return String[]
四、page
作用範圍:當前頁面從開啟到關閉這段時間,它只能在同一個頁面中有效。
具有page範圍的物件被繫結到javax.servlet.jsp.PageContext物件中。
五、升級
request和page的生命週期都是短暫的,它們之間的區別:一個request可以包含多個page頁(include,forward及filter)
為了避免與Servlet API耦合在一起,方便Action類做單元測試,Struts 2對HttpServletRequest、HttpSession和ServletContext進行了封裝,構造了三個Map物件來替代這三種物件,在Action中,直接使用HttpServletRequest、HttpSession和ServletContext對應的Map物件來儲存和讀取資料。
要獲取這三個Map物件,可以使用com.opensymphony.xwork2.ActionContext類,ActionContext是action執行的上下文,在ActionContext中儲存了action執行所需的一組物件,包括parameters、request、session、application和locale等。ActionContext類定義瞭如下方法,用於獲取HttpServletRequest、HttpSession和ServletContext對應的Map物件。
public Object get(Object key)
ActionContext類沒有提供類似getRequest()這樣的方法來獲取封裝了HttpServletRequest的Map物件。要得到請求Map物件,你需要為get()方法傳遞引數“request”。
public Map getSession()
獲取封裝了HttpSession的Map物件。
public Map getApplication()
獲取封裝了ServletContext的Map物件。
例:通過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內建的表示式語言來訪問request、session。、
下面我們通過幾個簡單的例子,來看一下這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.jsp和test2.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.jsp和test2.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.jsp和test2.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應用程式執行期間,都可以訪問這個範圍內的物件。