1.通过ActionContext来访问Map类型 request session application对象
2通过 RequestAware SessionAware ApplicationAware 接口来访问Map类型的request session application对象(IOC方式)
3通过ServletActionContext来访问Servlet API类型的HttpServletRequest HttpSession ServletContext对象(依赖于Servlet API方式)
4通过ServletRequestAware接口来访问Servlet API类型的HttpServletRequest HttpSession ServletContext对象(IOC方式)
其中,前两种方式与Servlet API解耦合 后两种方式与Servlet API耦合
以下是其简单用法案例
package com.struts2.action;
import java.util.Date;
import java.util.Map;
import org.apache.struts2.dispatcher.SessionMap;
import com.opensymphony.xwork2.ActionContext;
public class ActionContextAction {
/**
* *如何获取web资源*
* 1.什么是web资源
* HttpServletRequest,ServletContext(application),HttpSession等,即servlet API
* 2.为什么要获取web资源
* B/S的应用,所以必然要访问到web资源:1.域对象取值赋值,获取realPath,使session失效....
* 3.如何获取
* 1>解耦的方式获取web资源
* 解耦:struts2把原生的servletAPI转化成其对应的Map集合,所以我们可以通过操作Map集合
* 达到访问web资源的目的。
* 因为web资源是服务器(tomcat)提供的,所以我们使用Map集合操作web资源,则不必须
* 启动服务器,可以
* 直接利用main方法或者JUnit(单元测试)进行测试,但是一般我们还要启动服务器
* 1)通过actionContext对象获取
* 2)通过实现接口获取
* 两种方式在什么情况下使用:一般情况下使用action上下文对象获取
* 如果处理请求的多个方法都需要获取web资源,那么用aware接口比较合适
* 2>耦合的方式获取:使用servlet原生api
* 1)通过ServletActionContext(action的servlet上下文)获取
* 2)通过aware接口实现
*/
public String execute(){
//ActionContext:action上下文对象,我们可以从中获取一切action所需要的资源,包括web资源(Map集合)
ActionContext actionContext = ActionContext.getContext();
//获取application对应的Map对象
Map<String,Object> applicationMap = actionContext.getApplication();
//赋值
applicationMap.put("applicationKey", "applicationValue");
//在jsp页面中用el表达式取得applicationscope下key对应的value
//${applicationScope.applicationKey }或${applicationKey }
//取index.jsp页面在application中存储的日期
Date nowDate = (Date)applicationMap.get("date");
System.out.println(nowDate);
//获取session对应的Map对象
Map<String,Object>sessionMap = actionContext.getSession();
System.out.println("sessionMap的类型为"+sessionMap.getClass());
sessionMap.put("sessionKey", "sessionValue");
//sessionMap对象实际为SessionMap类对象 该类提供了invalidate方法
if (sessionMap instanceof SessionMap) {
SessionMap sMap = (SessionMap) sessionMap;
//清空session
sMap.invalidate();
}
//获取request对应的Map对象 *****通过get(“request”)方式获取
Map<String,Object>requestMap = (Map<String,Object>)actionContext.get("request");
requestMap.put("requestKey", "requestValue");
//获取parameters对应的Map对象
Map<String, Object>parametersMap = actionContext.getParameters();
//不能存 但存了不报错
//parametersMap.put("parametersKey", "parametersValue");
//对应的url请求:http://localhost:8081/struts2-4-GetServletApi/actionContext-result.action?name=aaa
//el取值方式 (因为value为数组所以):parameters: ${parameters.name[0]}
return "success";
}
}
package com.struts2.action;
import java.util.Map;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.ParameterAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
public class AwareAction implements ApplicationAware,SessionAware,RequestAware,ParameterAware{
Map<String, Object> applicationMap;
public String execute(){
System.out.println("execute");
System.out.println("date="+applicationMap.get("date"));
return "success";
}
public String result(){
System.out.println("result");
return "success";
}
public String result2(){
System.out.println("result2");
return "success";
}
public String result3(){
System.out.println("result3");
return "success";
}
//依赖注入
//(程序员)依赖(struts2框架)注入(方法的参数)
@Override
public void setApplication(Map<String, Object> application) {
//将注入的application对象赋值给全局变量
applicationMap = application;
// TODO Auto-generated method stub
System.out.println("setApplication");
}
@Override
public void setParameters(Map<String, String[]> parameters) {
// TODO Auto-generated method stub
}
@Override
public void setRequest(Map<String, Object> request) {
// TODO Auto-generated method stub
}
@Override
public void setSession(Map<String, Object> session) {
// TODO Auto-generated method stub
}
}
package com.struts2.action;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
public class ServletActionContextAction {
private static ServletActionContextAction sacaction;
public String getServeltApiWithServeltAC(){
//ServletActionContext
//得到request
HttpServletRequest request = ServletActionContext.getRequest();
//得到session
HttpSession session = request.getSession();
//得到application
ServletContext application = ServletActionContext.getServletContext();
System.out.println("date:"+application.getAttribute("date"));
return "success";
}
}
package com.struts2.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 ServletAwareAction implements ServletContextAware,ServletRequestAware,ServletResponseAware{
public String execute(){
return "success";
}
HttpServletRequest request;
@Override
public void setServletRequest(HttpServletRequest request) {
// TODO Auto-generated method stub
this.request = request;
}
@Override
public void setServletContext(ServletContext context) {
// TODO Auto-generated method stub
}
@Override
public void setServletResponse(HttpServletResponse response) {
// TODO Auto-generated method stub
}
}