为了降低与Servlet API的耦合,Struts2构造map对象来代替Servlet对象,包括HttpServletRequest、HttpSession、ServletContext,在Action中可直接使用Servlet对象对应的map对象来存储数据。
通常Struts2有两种方式访问Servlet对象:
方式一:借助于ServletActionContext对象,直接获取
1、ActionContext是Action执行上下文环境,每个上下文基本上都是一个对象容器,包含了动作执行所需的对象。
2、ActionContext是Thread Local的,存放在每个线程中的值唯一,线程安全。
3、ServletActionContext直接集成自ActionContext,提供了与Servlet对象的直接访问,可直接获取Servlet对象。
//获取HttpServletRequest对象
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("key", "value");//向request域中添加数据
//获取HttpServletResponse对象
HttpServletResponse response=ServletActionContext.getResponse();
response.getWriter();//获取文本输出流
//获取Servlet上下文对象
ServletContext context =ServletActionContext.getServletContext();
//获取PageContext对象
PageContext pageContext =ServletActionContext.getPageContext();
//通过PageContext对象获得ServletRequest对象
ServletRequest servletRequest = pageContext.getRequest();
ServletResponse servletResponse = pageContext.getResponse();
ServletConfig servletConfig = pageContext.getServletConfig();
pageContext.getServletContext();
HttpSession session = pageContext.getSession();
ActionContext与ServletActionContext比较
1、ActionContext主要负责对值的操作,ServletActionContext主要用于获取Servlet对象。
2、优先使用ActionContext,只有ActionContxt不能满足功能要求时才使用ServletActionContext,尽量使Action与Web无关。
3、使用ActionContext时,不要在Action的构造函数里使用ActionContext.getContext()。
方式二:实现指定的接口,由struts2框架运行时注入
1、实现Aware接口利用了依赖注入的方式能够让应用程序有更好的重用性。
2、Struts2提供了4种分别用来访问ServletContext、HttpServletRequest、HttpServletResponse、HttpSession对象的接口
org.apache.struts2.util.ServletContextAware;
org.apache.struts2.interceptor.ServletRequestAware;
org.apache.struts2.interceptor.ServletResponseAware;
org.apache.struts2.interceptor.SessionAware;
举例:
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.interceptor.ServletRequestAware;
import com.opensymphony.xwork2.ActionSupport;
public class ActionTest extends ActionSupport implements ServletRequestAware {
private HttpServletRequest request = null;
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
public String execute() {
request.setAttribute("request", "Request的属性值");
request.getSession().setAttribute("sessionTestKey", "测试SessionAware");
return this.SUCCESS;
}
}