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