Struts中ActionContext和ServletActionContext的比较
来源:互联网 发布:算法复杂性 Johnson 编辑:程序博客网 时间:2024/05/23 01:13
转:http://blog.sina.com.cn/s/blog_680e2f5b01015bkq.html
一、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。
- Struts中ActionContext和ServletActionContext的比较
- Struts中ActionContext和ServletActionContext的比较
- Struts中ActionContext和ServletActionContext的比较
- Struts中ActionContext和ServletActionContext的比较
- Struts中ActionContext和ServletActionContext的比较
- Struts中ActionContext和ServletActionContext的比较
- Struts中ActionContext和ServletActionContext的比较
- Struts中ActionContext和ServletActionContext的比较
- Struts中ActionContext和ServletActionContext的比较 [转]
- Struts中ActionContext和ServletActionContext
- 在web开发中ActionContext和ServletActionContext的比较
- Struts ActionContext和ServletActionContext小结
- ServletContext,ActionContext和ServletActionContext比较
- ActionContext和ServletActionContext的区别
- ActionContext和ServletActionContext的区别
- actionContext和ServletActionContext的区别:
- actionContext和ServletActionContext的区别:
- Actioncontext和ServletActioncontext的区别
- 第一天 菜鸟前进之道 activity
- GloVe学习之Python中简单的词向量SVD分解
- WCF绑定的选择
- POJ Count Color 2777(线段树)
- CheckBox全选与反转
- Struts中ActionContext和ServletActionContext的比较
- Java多态性理解,好处及精典实例
- AngularJS系列之JavaScript函数和对象
- MySQL的TPS和QPS 计算方式
- ReactiveCocoa之RACMulticastConnection使用(六)
- 使用LiveCD制作Linux Ubantu系统img镜像文件
- 面向对象的5个基本设计原则
- 第七周 项目 1 - 建立顺序环形队列算法库(补)
- 前端学习