Struts2的Action并未直接与任何servletAPI耦合,但对于Web应用的控制器而言,不访问Servlet API几乎是不可能的,例如跟踪HTTP Session状态等。
web应用中通常需要访问的servlet API就是HttpServletRequest、httpSession和ServletContext,这三个接口分别代表JSP内置对象中的request、session和application。
struts2有两种方式获取servletAPI:非IOC方式和IOC方式
一、非IOC方式
·struts2提供了一个ActionContext类,struts2可以通过该类来访问servletAPI(推荐使用该方法)
ActionContext类中包含的几个常用的方法:
1、Object get(Object key):该方法类似于调用HttpServletRequest的getAttribute(String name)方法
2、Map getApplication():返回一个Map对象,该对象模拟了该应用的ServletContext实例
3、static ActionContext getContext():静态方法,获取系统的ActionContext实例
4、Map getParameters():获取所有的请求参数。类似于调用HttpServletRequest对象的getParameterMap()方法
5、Map getSession():返回一个Map对象,该Map对象模拟了HttpSession实例
6、void setApplication(Map application):直接传入一个Map实例。将该Map实例里的key-value对转换成application的属性名,属性值
7、void setSession(Map session):直接传入一个Map实例,将该Map实例里的key-value转换成session的属性名、属性值
示例:
public String execute() throws Exception {
String name="admin";
//获取session
Map session=ActionContext.getContext().getSession();
//将想要存放的值放到session域中
session.put("sessionName",name);
//获取request--获取的是HttpServletRequest对象的attribute
Map request=(Map) ActionContext.getContext().get("request");
//将值存放到request域中
request.put("requestName", name);
//获取application
Map application=ActionContext.getContext().getApplication();
//将值存入application域中
application.put("applicationName", name);
return null;
}
//获取HttpServletRequest
HttpServletRequest request=(HttpServletRequest) ActionContext.getContext().get(StrutsStatics.HTTP_REQUEST);
//通过request获取session
HttpSession session=request.getSession();
·通过ServletActionContext的静态方法获取
ServletActionContext工具类包含如下的几个静态方法:
static PageContext getPageContext();取得web应用的PageContext对象
static HttpServletRequest getRequest();取得web应用的HttpServletRequest对象
static HttpServletResponse getResponse();取得web应用的HttpServletResponse对象
static ServletContext getServletContext();取得web应用的ServletContext对象
public String execute() throws Exception {
//获取HttpServletRequest
HttpServletRequest request=ServletActionContext.getRequest();
//通过request获取session
HttpSession session=request.getSession();
return null;
}
二、IOC(控制反转Inversion of Control)
为了在Action中直接访问ServletAPI,Struts2还提供了如下几个接口
。
1)request 对应ServletRequestAware接口
2)response 对应ServletResponseAware接口
3)session 对应SessionAware接口
4)application 对应ServletContextAware接口
Struts2在实例化一个action对象时,如果发现他实现了相关的Aware接口,就会把相应的资源通过Aware接口方法注入进去,所以叫做注入方式(IOC
方式),以request为例,实现了ServletRequestAware接口,就会有一个setServletRequest()方法获取request对象,Aware接口实际上是一种拦截
器,它会在执行Action前执行,把相关的servlet对象设置进来,代码如下:
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.interceptor.ServletRequestAware;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport implements ServletRequestAware{
HttpServletRequest request;
public String execute() throws Exception {
String name="admin";
request.setAttribute("name", name);
return null;
}
@Override
public void setServletRequest(HttpServletRequest request) {
//通过该方法可直接获取到request对象
this.request=request;
}
}