Action 中访问servletAPI的方式总结
2016-07-06 17:57
267 查看
在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";
}
}
相关文章推荐
- sql:批量插入数据
- android关于关闭任意的activity
- 深入理解Java:注解(Annotation)自定义注解入门
- ogg数据加密
- angularjs ng-show和css display的区别
- 删除匹配行之后或者之前的数据
- STM32 FreeModbus RTU从机移植以及UART配置
- css实现图片垂直居中(兼容IE6/IE7)
- zbarsdk
- 杂谈
- 1.5 提取单元格数值,并累加 P34
- The matching wildcard is strict, but no declaration can be found for element 解决方法
- Shell脚本-判断文件有无进而复制
- NYOJ 257 郁闷的C小加(一) (栈 、中缀转后缀)
- 拯救小矮人(codevs 2544)
- QEMU/KVM虚拟机安装配置
- 【机器学习】Logistic Regression 学习笔记
- 深入了解JavaScriptCore(二)
- 2016/7/6
- 【jsp】自定义jsp标签(下拉框数据字典)