博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Struts中ActionContext和ServletActionContext的比较
阅读量:5080 次
发布时间:2019-06-12

本文共 2449 字,大约阅读时间需要 8 分钟。

一、ActionContext

在Struts2开发中除了将请求参数自动设置到Action的字段中,往往也需要在Action里直接获取请求(Request)或会话(Session)的一些信息,甚至需要直接对JavaServlet Http的请求(HttpServletRequest)和响应(HttpServletResponse)操作。

ActionContext(com.opensymphony.xwork.ActionContext)是Action执行时的上下文,上下文可以看作是一个容器(其实我们这里的容器就是一个Map而已),它存放的是Action在执行时需要用到的对象。一般情况我们的ActionContext都是通过:ActionContext context = (ActionContext) actionContext.get()来获取的。

actionContext对象的创建过程是static ThreadLocal actionContext = new ActionContextThreadLocal()。
ActionContextThreadLocal是实现ThreadLocal的一个内部类。ThreadLocal可以命名为"线程局部变量",它为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。这样ActionContext里的属性只会在对应的当前请求线程中可见,从而保证它是线程安全的。

 

通过ActionContext取得相关对象

取得session:Map session = ActionContext.getContext().getSession();
取得request:Map request = (Map)ActionContext.getContext().get("request");
在Action中取得request请求参数"username"的值:
若有一个提交过来的username,那么通过param.get("username")可以取值。值得注意的是param.get("username")是一个String数组,Struts就是这样设计的。既然是String数组就需要这样取值:
String value[] = (String[])param.get("username");
String username = "";
for(int i=0;i<value.length;i++)
{
 username +=value[i];
}

二 、ServletActionContext
ServletActionContext(com.opensymphony.webwork.ServletActionContext),该类直接继承了ActionContext提供直接与Servlet相关对象访问的功能,故ServletActionContext也线程安全。可取得对象:
1 javax.servlet.http.HttpServletRequest:HTTPservlet请求对象
2 javax.servlet.http.HttpServletResponse:HTTPservlet响应对象
3 javax.servlet.ServletContext:Servlet上下文信息
4 javax.servlet.ServletConfig:Servlet配置对象
5 javax.servlet.jsp.PageContext:Http页面上下文
从ServletActionContext里取得Servlet的相关对象
取得HttpServletRequest对象: HttpServletRequest request = ServletActionContext. getRequest();
取得HttpSession对象: HttpSession session = ServletActionContext. getRequest().getSession();

三 、ServletActionContext和ActionContext联系
ServletActionContext和ActionContext有着一些重复的功能,该如何去抉择?
遵循的原则是:ActionContext能够实现我们的功能,最好就不要使用ServletActionContext,让Action尽量不要直接去访问Servlet的相关对象。

四 、注意点
不要在Action的构造函数里使用ActionContext.getContext(),因为此时ActionContext里的一些值也许没有设置,这时通过ActionContext取得的值也许是null。同样HttpServletRequest req = ServletActionContext.getRequest()也不要放在构造函数中,也不要直接将req作为类变量给其赋值。

原因是static ThreadLocal actionContext = new ActionContextThreadLocal()可以看出ActionContext是线程安全的,而ServletActionContext继承自ActionContext故ServletActionContext也线程安全。线程安全要求每个线程都独立进行,故req的创建也要求独立进行,故ServletActionContext.getRequest()不要放在构造函数中,也不要直接放在类中,而应放在每个具体方法体中如login(),queryAll(),insert()等,才能保证每次产生对象时独立的建立了一个req。

 

转载于:https://www.cnblogs.com/kisty/p/5487370.html

你可能感兴趣的文章
QT程序在发布的时候应注意的地方
查看>>
图算法--最短路径算法的实现与应用
查看>>
zend framework 韩顺平视频讲座笔记- (1) 环境配置
查看>>
股权期权问题基本上搞明白了
查看>>
ActionContext、ServletContext、pageContext的区别?
查看>>
基于行的操作
查看>>
新手 vim常用命令总结 (转)
查看>>
SharpNodeSettings项目,可配置的数据采集,统一的工业数据网关,OPC UA服务器开发,PLC数据发布到自身内存,redis,opc ua,以及数据可视化开发...
查看>>
面向对象——(4)静态方法
查看>>
定位真机运行能用但是打包成apk就不能用的解决方法
查看>>
[收藏贴]CSS Reset(忘记出处了)
查看>>
IOS开发之路四(UITabBarController)
查看>>
wcf 服务器无法处理请求由于内部错误
查看>>
windows下redis 配置文件参数说明
查看>>
Nginx缓存、压缩配置
查看>>
内网渗透笔记---msf
查看>>
小计一次linux下渗透方法
查看>>
移动开发小技巧
查看>>
linux基本命令(2)-备份压缩命令
查看>>
2.拷贝控制操作(三/五法则)
查看>>