Struts2的Action没有与任何Servlet API耦合,这是Struts2的一个设计良好之处,由于Action类不再与Servlet API耦合,从而可以更轻松地测试该Action。
但对于Web应用的控制器而言,不访问Servlet API几乎是不可能的,例如跟踪HTTP Session。Struts2框架提供了一种更轻松的方式来访问Servlet API。Web应用通常需要访问的Servlet API就是HttpServletRequest,HttpSession和ServletContext,这3个接口分别代表JSP内置对象中的request,session和application。
Struts2提供了一个ActionContext类,Struts2的Action可以通过该类来访问Servlet API。下面是ActionContext类中包含的几个常用方法:
方法 | 说明 |
static ActionContext getContext( ) | 获取系统的ActionContext实例 |
Object get(Object key) | 该方法类似于调用HttpServletRequest的getAttribute(String name)方法 |
Map getSession( ) | 返回的map对象模拟了HttpSession实例 |
Map getApplication( ) | 返回的map对象模拟了该应用的ServletContext实例 |
Map getParameters( ) | 获取所有的请求参数。类似于调用HttpServletReuqest的 getParameterMap( )方法 |
void setSession(Map session) | 直接传入一个map实例,map的key-value对转换成 session的属性名和属性值 |
void setApplication(Map application) | 直接传入一个map实例,map的key-value对转换成 application的属性名和属性值 |
public class Login extends ActionSupport{
...
public String execute(){
if(getUsername().equals("scott")&& getPassword().equals("tiger")){
ActionContext.getContext().getSession().put("username",getUsername());
return "success";
}
return "login";
}
}
然后在ok.jsp中有如下代码:
login success! welcome ${username}...
访问程序时,EL表达式可以输出正确的值,这说明
ActionContext.getContext( ).getSession( ).put("username",getUsername( ))确实往session里放入了数据,也即通过ActionContext访问到了Servlet API。