在struts2中,能夠在JavaBean類中寫公用的返回值爲String類型的方法來響應頁面上的請求,也能夠在此方法中獲取web資源,如:request,application,session,parameters等。 java
步驟: web
經過ActionContext.getContext()獲取一個ActionContext的實例 apache
此Map類型爲Map<String,Object>。獲取方法: session
application |
ActionContext.getApplication() |
session |
ActionContext.getSession() |
parameters |
ActionContext.getParameters() |
request [特殊] |
ActionContext.get("request") |
能夠看到除request外,獲取方法都是get...,而對於request,struts2沒有提供對應的get方法,因此使用的是get("request")。緣由以下: app
在視頻裏有對struts2源碼的解釋,大體意思是: this
使用getSession()方法,實際上調用的是Object ActionContext.get(String key),這個key是ActionContext定義好的一個字符串,例如對於session,其值爲: spa
public static final String SESSION = "com.opensymphony.xwork2.ActionContext.session" code
可是對於request,則沒有定義對應的字符串,因此也就沒有提供相應的get方法。獲取session等web資源其實就是獲取ActionContext中對應的Map對象,因此能夠使用Object ActionContextget(String key)方法來獲取request對應的Map對象。也就是說獲取request和獲取session等web資源對應的Map對象,本質上是同樣的。 視頻
這只是我能理解的部分,至於更深層次的struts2源碼機制,雖然源碼就在那裏,可是目前我還看不懂,就先理解到這種程度吧。 對象
可是此操做對於parameters資源來講,獲取的是一個String []類型,因此若是有名字相同的parameters,要取得特定的parameters,還須要提供一個下標值,如:
Map<String,Object> parametersMap = actionContext.getParameters(); System.out.println("patameters:"+((String[])parametersMap.get("name"))[0]);
public class TestAware implements ApplicationAware,SessionAware,ParameterAware,RequestAware
【其中parameters對應的是:Map<String , String[]>類型,這點要比ActionContext好一點】
private Map<String, Object> application; private Map<String, Object> request; private Map<String, String[]> parameters; private Map<String, Object> session;
public void setApplication(Map<String, Object> application) { this.application = application; } public void setRequest(Map<String, Object> request) { this.request = request; } public void setParameters(Map<String, String[]> parameters) { this.parameters = parameters; } public void setSession(Map<String, Object> session) { this.session = session; }
public String execute(){ //1.application //設置一個屬性 application.put("applicationKey", "applicationValue"); //獲取一個屬性 System.out.println(application.get("date")); //2.session session.put("sessionKey", "sessinoValue"); //3.request request.put("requestKey", "requestValue"); //4.parameters System.out.println(((String [])parameters.get("name"))[0]); return "success"; }
若一個 Action 類中有多個 action 方法, 且多個方法都須要使用域對象的 Map 或 parameters, 則建議使用Aware 接口的方式
package com.laolang.action; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; public class TestServletActionContextAction { public String execute(){ //經過 ServletActionContext獲取web資源 HttpServletRequest request = ServletActionContext.getRequest(); // HttpServletResponse response = ServletActionContext.getResponse(); // HttpSession session = request.getSession(); //向request中添加一個屬性 request.setAttribute("ServletActionContext", "ServletActionContext"); return "success"; } }
如RequestAware,ServletResponseAware, ServletContextAware等接口
package com.laolang.action; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.interceptor.ServletRequestAware; import org.apache.struts2.interceptor.ServletResponseAware; import org.apache.struts2.util.ServletContextAware; public class TestServletAwareAction implements ServletRequestAware, ServletResponseAware, ServletContextAware { public String execute(){ return "success"; } public void setServletContext(ServletContext context) { System.out.println(context); } public void setServletResponse(HttpServletResponse response) { System.out.println(response); } public void setServletRequest(HttpServletRequest request) { System.out.println(request); } }