在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,还需要提供一个下标值,如:
Map<String,Object> parametersMap = 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 Map<String, Object> application;
private Map<String, Object> request;
private Map<String, String[]> parameters;
private Map<String, Object> session;
3.在各个接口对应的未实现方法中设置相应的属性的值
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;
}
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);
}
}
来源:oschina
链接:https://my.oschina.net/u/1442002/blog/489390