一、web資源是什麼?
web資源是HttpServletRequest、HttpSession、ServletContext等原生的Servlet API。
二、爲什麼要訪問web資源?
B/S的應用的controller中必然需要訪問web資源,比如:向域對象中讀寫屬性、讀寫Cookie、獲取realPath等...
三、怎麼訪問web資源?
訪問web資源有兩種方式:
和Servlet API解耦的方式:
只能訪問到有限的servlet API對象,而且只能訪問到有限的方法(讀取請求參數、訪問域對象的屬性、使session失效等...)
(1)實現ActionContext
爲了避免與servlet API耦合在一起,方便Action做單元測試。 ActionContext是Action執行的上下文對象。 在ActionContext中保存了Action執行所需要的所有對象。 包括parameters、request、session、application等。 獲取HttpServletRequest對應的Map對象:
public Object get(Object key):ActionContext類中沒有提供類似getRequest()這樣的方法來獲取HttpServletRequest對應的Map對象。要得到HttpServletRequest對應的Map對象,可以通過爲get()方法傳遞“request”參數實現。
獲取HttpSession對應的Map對象: public Map getSession();
獲取ServletContext對應的Map對象: public Map getApplication();
獲取請求參數對應的Map對象: public Map getParameters();
(2)實現XxxAware接口
Struts2提供了4種分別來訪問ActionContext、Request、Response和Session對象的接口,
根據具體需要選擇就可以了。4個接口如下:
org.apache.struts2.interceptor.ApplicationAware
org.apache.struts2.interceptor.SessionAware
org.apache.struts2.interceptor.RequestAware
org.apache.struts2.interceptor.ParameterAware
選用建議:若一個Action類中有多個action方法,且多個方法都需要使用域對象的Map或parameters,
則建議使用Aware接口的方式。因爲只要定義成員變量就可以了(不用在每個方法裏獲取)。
和Servlet API耦合的方式:
可以訪問更多的servlet API對象,且可以調用其原生的方法。 在動作類裏,可以通過ServletActionContext對象或通過實現Aware接口去訪問Web資源。 實現Aware接口是依賴注入技術的一種實現,這也是推薦的方法,因爲它將使你的動作類更容易測試。
(1)實現ServletActionContext
ServletActionContext包括ActionContext,並且比ActionContext更容易使用。有以下方法:
public static javax.servlet.http.HttpServletRequest getRequest(),返回當前HttpServletRequest對象;
public static javax.servlet.http.HttpServletResponse getResponse(),返回當前HttpServletResponse對象;
public static javax.servlet.ServletContext getServletContext(),返回ServletContext對象;
可以通過在HttpServletRequest對象上調用一個getSession方法的辦法來獲得HttpSession對象。如果使用了basicStack或defaultStack攔截器棧,HttpSession對象將被自動創建。
注意:不應該從動作類的構造器裏調用ServletActionContext類的方法.
因爲在這個階段,底層的ActionContext對象還沒有被傳遞給它。
從某個動作的構造器裏調用ServletActionContext.getServletContext方法將返回空值;
(2)實現ServletXxxAware接口
Struts2提供了4種分別來訪問ServletContext、HttpServletRequest、HttpServletResponse和HttpSession對象的接口,根據具體選擇即可。
4個接口如下:
org.apache.struts2.util.ServletContextAware;
org.apache.struts2.interceptor.ServletRequestAware;
org.apache.struts2.interceptor.ServletReponseAware;
org.apache.struts2.interceptor.SessionAware;