Struts中ActionContext和ServletActionContext的比较

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

一、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。

目录
相关文章
|
Java 开发者
ActionContext、ValueStack、OGNL | 学习笔记
快速学习 ActionContext、ValueStack、OGNL 代理,介绍了 ActionContext、ValueStack、OGNL 系统机制, 以及在实际应用过程中如何使用。
35 0
|
存储 Java 对象存储
Struts2【OGNL、ValueStack】
Struts2【OGNL、ValueStack】
88 0
Struts2【OGNL、ValueStack】
|
存储 Java
Struts2【OGNL、valueStack】就是这么简单
什么是OGNL表达式? OGNL是Object Graphic Navigation Language 是操作对象属性的开源表达式。 Struts2框架使用OGNL作为默认的表达式语言。 为什么我们学习OGNL 在学习JSP的时候,我们已经学习过了EL表达式。
2055 0
|
Java 数据格式 JSON
|
Java
Struts中ModelDriven的使用
它是Struts2种独有的一种接收用户输入的机制,想在项目中使用模型驱动 (ModelDriven)需要让Action实现com.opensymphony.xwork2.ModelDriven 接口,使用它 的getModel()方法来通知Struts2要注入的属性类型,并且声明属性时一定要实例化,但不需get, set方法。  package com.lsc.alan.action;    
1576 0