在Struts2的框架中,Action与Servlet API相互分离,这是Struts2相对于Struts1的一个优化之处。相互分离
的好处就是便于测试action,但是这样的话,Action便无法访问Servlet API。
Web应用中通常需要访问的Servlet API 就是HttpServletRequest,HttpServletResponse,HttpSession这三个类,分别代表jsp内置对象request,response,session。所以,在Struts2框架中,提供了以下几种方法:
1、使用ActionContext
Struts2提供了一个ActionContext类,action运行期间所用到的数据都保存在ActionContext类中,例如session,客户端传递的参数等等。ActionContext是Action中的一个上下文对象。可以通过该类直接访问ServletAPI,此种方式没有侵入性。
//第一种使用ActionContext访问session,如果为空,则重定向到登录页面
ActionContextactionContext = ActionContext.getContext();
if(actionContext.getSession().get("user")== null){
return"login";
}
通过如上方式先创建actionContext对象,然后通过调用getSession()方法获得HttpSession对象。并对该对象取值进行下一步判断。
下面是ActionContext常用的几个方法:
Object get(Object key ):该方法类似于HttpServletRequest的getAttribute(Stringname) 方法。
Map getApplication():返回一个Map对象,该对象模拟了该应用的ServletContext实例。
Static ActionContextgetContext():静态方法,获取系统的ActionContxt对象。
Map getParameters():获取所有的请求参数,类似于HttpServletRequest对象的getParameterMap()方法。
Map getSession():返回一个map对象,该Map模拟了HttpSession实例。
Void setApplication(mapAapplication)直接传入一个Map实例,讲Map实例里的key=value对转换成application 的属性名,属性值。
Void setSession(MapSession)直接传入一个Map实例,讲该map实例的key-value转换成Session的属性名属性值。
2·实现相应的接口:
在Action中实现如下的一些接口:
org.apache.struts2.util.ServletContextAware:实现该接口的Action可以访问ServletContext对象。
org.apache.struts2.interceptor.ServletRequestAware:实现该接口的Action可以访问ServletRequest对象。
org.apache.struts2.interceptor.ServletResponseAware:实现该接口的Action可以访问ServletResponse对象。
org.apache.struts2.interceptor.SessionAware:实现该接口的Action可以访问HttpSession对象。
看下面的例子:
packagecom.shengsiyuan.struts2;
importjavax.servlet.http.HttpServletRequest;
importorg.apache.struts2.interceptor.ServletRequestAware;
importcom.opensymphony.xwork2.Action;
publicclass VerifyAction implements Action,ServletRequestAware {
privateHttpServletRequest request;
publicHttpServletRequest getRequest() {
returnrequest;
}
publicvoid setRequest(HttpServletRequest request) {
this.request= request;
}
@Override
publicString execute() throws Exception {
//第二种 通过实现接口ServletRequestAware
if(request.getSession().getAttribute("user")!= null){
return"must";
}
return"login";
}
@Override
//必须要实现接口的set方法
publicvoid setServletRequest(HttpServletRequest request) {
this.request=request;
}
}
3·使用ServletActionContext
通过ServletActionContext提供的一系列的静态方法访问Servlet API。
*getPageContext();
*getRequest();
*getResponse();
*getServletContext();
看下面实例:
packagecom.shengsiyuan.struts2;
importorg.apache.struts2.ServletActionContext;
importcom.opensymphony.xwork2.Action;
public classVerifyAction implements Action,ServletRequestAware {
@Override
publicString execute() throws Exception {
//判断session中是否存在值,如果存在,则进入受保护页面,如果不存在,则“重定向”到登录页面
//第三种 通过实现类ServletActionContext的静态方法getRequest()
if(ServletActionContext.getRequest().getSession().getAttribute("user")!= null)
{
return"must";
}
return"login";
}
}