在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); } }