1、使用struts2提供的一个ServletActionContext工具类,在该类中包含了一系列相对应的静态方法,可以直接获取。
该类包含了一下几个静态方法:
-
static PageContext getPageContext():取得Web应用的PageContext对象。
-
static HttpServletRequest getRequest():取得Web应用的 HttpServletRequest对象。
-
static HttpServletResponse getResponse():取得Web应用的HttpServletResponse对象。
-
static ServletContext getServletContext():取得Web应用的ServletContext对象。
/**
* 在struts2框架中有三种方式可以获取到ServletAPI对象
* ServletAPI对象包含了:
* request,response,HttpSession,ServletContext
* 第一种方式:
* 使用的是ServletActionContext对象,它里面提供了一些静态方法,可以让我们获取到ServletAPI
* 此种方式,使我们实际开发中采用最多的方式
* 此时我们还要记住一件事:
* 这四个对象,有一个已经变了,和其他三个不一样,找出来,记住。
*
* org.apache.struts2.dispatcher.StrutsRequestWrapper@1577071 它是那个不一样的
org.apache.catalina.connector.ResponseFacade@1973ca4
org.apache.catalina.session.StandardSessionFacade@e4d72
org.apache.catalina.core.ApplicationContextFacade@fe7e93
*
*/
public class HelloAction extends ActionSupport{
private HttpServletRequest request;
private HttpServletResponse response;
private HttpSession session;
private ServletContext application;
/**
* @return
*/
public String sayHello(){
request = ServletActionContext.getRequest();
response = ServletActionContext.getResponse();
session = request.getSession();
application = ServletActionContext.getServletContext();
System.out.println(request);
System.out.println(response);
System.out.println(session);
System.out.println(application);
return SUCCESS;
}
}
2、通过在业务控制类action实现相应的接口
- 实现ServletRequestAware可以获得request域
- 实现ServletResponseAware可以获得response域
- 实现ServletContextAware可以获得Application域
另外session是通过request中来进行获取的。
/**
* 在struts2框架中有三种方式可以获取到ServletAPI对象
* ServletAPI对象包含了:
* request,response,HttpSession,ServletContext
* 第二种方式:
* 采用实现接口的方式,来获取对象
* 能够使用对象的原因:
* 是因为在我们的sayHello方法执行之前,已经有一些拦截器执行了。
* 通过struts-default.xml我们能知道默认的拦截器栈defaultStack,
* 在我们的动作配置时,默认就会有该拦截器栈中的所有拦截器执行。先正序,再倒序。
*
* 帮我们给对象赋值全靠一个名称为servletConfig的拦截器
*
* 拦截器的重要性:
* 他可以在不改变我们动作方法的代码基础上,对我们的动作方法进行增强。
*/
public class Hello3Action extends ActionSupport
implements ServletRequestAware,ServletResponseAware,ServletContextAware{
private HttpServletRequest request;
private HttpServletResponse response;
private HttpSession session;
private ServletContext application;
/**
* @return
*/
public String sayHello(){
session = request.getSession();
System.out.println(request);
System.out.println(response);
System.out.println(session);
System.out.println(application);
return SUCCESS;
}
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
@Override
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}
@Override
public void setServletContext(ServletContext application) {
this.application = application;
}
}
3、通过ActionContext类
Struts2提供了ActionContext类,struts2可以通过该类来实现与Servlet API的访问。
ActionContext类提供了如下几种方法:
- Object get(Object key):类似于调用HttpServletRequest的getAttribute(String name)方法
- Map getApplication():返回一个Map对象,该对象模拟了该应用的ServletContext实例。
- static ActionContext getContext():这是个静态方法 获取系统的ActionContext实例
- Map getParameters():获取所有的请求参数,类似于调用HttpServletRequest对象的getParameterMap()方法
- Map getSession() 返回一个Map对象,该对象模拟了HttpSession 实例
- void setApplication(Map application):传入一个Map实例,将Map实例的key-value转换成application的属性名-值。
- void setSession(Map session):传入一个Map实例,将Map实例的key-value转换成application的属性名-值。