天天看点

Struts中ActionContext和ServletActionContext的比较

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

原帖地址:http://blog.sina.com.cn/s/blog_680e2f5b01015bkq.html