在struts2中,可以在JavaBean类中写公用的返回值为String类型的方法来响应页面上的请求,也可以在此方法中获取web资源,如:request,application,session,parameters等。
一、与Servlet API 解耦的方式
通过ActionContext获取
步骤:
1.获取ActionContext对象
通过ActionContext.getContext()获取一个ActionContext的实例
2.获取web资源对应胡Map
此Map类型为Map<String,Object>。获取方法:
application | ActionContext.getApplication() |
session | ActionContext.getSession() |
parameters | ActionContext.getParameters() |
request [特殊] | ActionContext.get("request") |
可以看到除request外,获取方法都是get...,而对于request,struts2没有提供对应的get方法,所以使用的是get("request")。原因如下:
在视频里有对struts2源码的解释,大致意思是:
使用getSession()方法,实际上调用的是Object ActionContext.get(String key),这个key是ActionContext定义好的一个字符串,例如对于session,其值为:
public static final String SESSION = "com.opensymphony.xwork2.ActionContext.session"
但是对于request,则没有定义对应的字符串,所以也就没有提供相应的get方法。获取session等web资源其实就是获取ActionContext中对应的Map对象,所以可以使用Object ActionContextget(String key)方法来获取request对应的Map对象。也就是说获取request和获取session等web资源对应的Map对象,本质上是一样的。
这只是我能理解的部分,至于更深层次的struts2源码机制,虽然源码就在那里,但是目前我还看不懂,就先理解到这种程度吧。
3.使用获取到的Map对象的get()和put()方法获取或设置属性值
但是此操作对于parameters资源来说,获取的是一个String []类型,所以如果有名字相同的parameters,要取得特定的parameters,还需要提供一个下标值,如:
MapparametersMap = actionContext.getParameters();System.out.println("patameters:"+((String[])parametersMap.get("name"))[0]);
通过实现Aware接口获取web资源
1.Action类实现session,request,application,parameters对应的Aware接口
public class TestAware implements ApplicationAware,SessionAware,ParameterAware,RequestAware
2.添加session等对应的Map属性
【其中parameters对应的是:Map<String , String[]>类型,这点要比ActionContext好一点】
private Mapapplication;private Map request;private Map parameters;private Map session;
3.在各个接口对应的未实现方法中设置相应的属性的值
public void setApplication(Mapapplication) { this.application = application; } public void setRequest(Map request) { this.request = request; } public void setParameters(Map parameters) { this.parameters = parameters; } public void setSession(Map session) { this.session = session; }
4.在execute方法中调用每个Map的put()和get()方法
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"; }
关于ActionContext和Aware接口的选择:
若一个 Action 类中有多个 action 方法, 且多个方法都需要使用域对象的 Map 或 parameters, 则建议使用Aware 接口的方式
二、与Servlet API 耦合的方式
使用ServletActionContext
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"; }}
实现ServletXXXAware接口
如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); }}