在Action中访问 WEB资源
一、什么是WEB资源?
HttpServletRequest,HttpSession,ServletContext等原生的Servlet API
二、为什么访问WEB资源?
B\S的应用的Controller中必须需要访问WEB资源
向域对象中读写属性,读写Cookie,获取realPath
三、如何访问?
1、:和Servlet API解耦的方式:只能访问有限的Servlet API对象,且只能访问有限的方法。(读取请求参数,读写域对象的属性,使session失效)
具体请参照博文:Struts2之Session
(1)使用ActionContext
通过import com.opensymphony.xwork2.ActionContext;
(2)实现XxxAware接口
通过Action实现如下接口
import org.apache.struts2.dispatcher.SessionMap;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.SessionAware;
(3)选用的建议:若一个Action类中有多个action方法,且多个方法都需要使用域对象的Map或parameters,则建议使用Aware接口的方式
(4)session对应的Map实际上是SessioMap类型的,强转后若调用invalidate()方法,可以使其session失效。
2、和Servlet API耦合的方式 :可以访问更多的Servlet API对象,且可以调用原生态的方法。
(1)使用ServletActionContext
public String execute(){
//ServletActionContext:可以从中获取到当前Action对象需要的一切Servlet API 相关的对象
//1、获取HttpServletRequest:ServletActionContext.getRequest();
//2、获取HttpSession:ServletActionContext.getRequest().getSession();
//3、获取ServletContext
HttpServletRequest request=ServletActionContext.getRequest();
HttpSession session=ServletActionContext.getRequest().getSession();
ServletContext servletContext=ServletActionContext.getServletContext();
System.out.println("execute...");
return "success";
}
(2)实现ServletXxxAware接口
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.util.ServletContextAware;
//通过实现ServletXxxAware接口的方式可以由Struts2注入需要的Servlet相关的对象
//ServletRequestAware:注入HttpServletRequest对象(比较常用)
//ServletContextAware:注入ServletContext对象(比较常用)
//ServletResponseAware:注入HttpServletResponse对象
public class TestServletAware implements ServletRequestAware,ServletContextAware,ServletResponseAware{
public void setServletRequest(HttpServletRequest request) {
System.out.println(request);
}
private ServletContext context;
public void setServletContext(ServletContext context) {
System.out.println(context);
this.context=context;
}
public void setServletResponse(HttpServletResponse response) {
System.out.println(response);
}
public String execute(){
System.out.println("ServletContext:" + context);
return "success";
}
}