精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2004-10-12
private List myList; ..... } 现在的问题是:对于不同的用户 myList 竟然是相同的!!也就是说 myList 是所有调用MyAction的用户共享的(我的理解,不知道对不对) 而我的系统要求是不同的用户有自己的 myList 内容,不知道大家有没有碰到过这样的问题,是怎么解决的。 谢谢了先:) 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2004-10-12
Struts的Action不是线程安全的。
|
|
返回顶楼 | |
发表时间:2004-10-12
那有没有好的解决办法呢?
因为之前的项目中一直这样使用,现在才发现问题了:( 看来代码得从头改了。。。。瀑布汗 怎么才能让其属于线程安全呢? |
|
返回顶楼 | |
发表时间:2004-10-12
在Action中,通常是不建议通过属性来实现method之间的数据共享的。也就是说,在Action中,你就不应该有这种属性存在。把属性挪到method的局部变量里面去吧。
|
|
返回顶楼 | |
发表时间:2004-10-12
webwork就不会有这个问题了。
想起前年的一个同事用Struts做的一个程序,潜在一个这样的bug,不过还好这个功能用得少之又少。 |
|
返回顶楼 | |
发表时间:2004-10-12
robbin 写道 在Action中,通常是不建议通过属性来实现method之间的数据共享的。
难道method之间的数据共享只能通过session吗?这样session中岂不有太多的"垃圾"信息---如果不自己及时清理的话 有没有其他的共享数据的办法啊? |
|
返回顶楼 | |
发表时间:2004-10-12
半价优惠 写道 robbin 写道 在Action中,通常是不建议通过属性来实现method之间的数据共享的。
难道method之间的数据共享只能通过session吗?这样session中岂不有太多的"垃圾"信息---如果不自己及时清理的话 有没有其他的共享数据的办法啊? 通过参数传递和返回值来共享数据。当然,request, session也可以的。 |
|
返回顶楼 | |
发表时间:2004-10-12
DispatchAction 中的method的返回值和参数说白了就是request和session了............
唉~当初怎么没早早发现这个问题呢.没办法,从头改代码把:( |
|
返回顶楼 | |
发表时间:2004-10-13
class xxx{
//得到当前时间 private Timestamp currTime= new Timestamp(System.currentTimeMillis()); ..... } 我以前也遇到过这种问题,结果所有用户看到的时间都是一样的。 后来就把这个变量放到method中了,幸好发现的早,返工的工作量还不算大。 我的理解是: struts中一个类只会有一个实例在运行,所以造成所有的用户看到的都是同样的东西。不知道这样理解对不对? |
|
返回顶楼 | |
发表时间:2004-10-13
半价优惠 写道 DispatchAction 中的method的返回值和参数说白了就是request和session了............
唉~当初怎么没早早发现这个问题呢.没办法,从头改代码把:( method的返回值和参数怎么会是request和session呢? 在servlet中,只有request scope 的 attribue才是线程安全的。其实这个问题的起因是session中attribute的线程安全性. 而问题的出现是由于我们自己在处理存入session中的attribute时不够检点。不关struts的事,来看一下structs的代码。 在struts中,所有的*.do都是由org.apache.struts.action.ActionServlet来处理的。 //大家都知道的处理入口,呵呵,发现struts只支持了post 和 get 方法。 public void doPost(HttpServletRequest request, HttpServletResponse response); throws IOException, ServletException { process(request, response);; } //跟踪过去,来看看process代码 protected void process(HttpServletRequest request, HttpServletResponse response); throws IOException, ServletException { RequestUtils.selectModule(request, getServletContext(););; getRequestProcessor(getModuleConfig(request););.process (request, response);; } //getRequestProcessor();.process是真正的逻辑处理者 protected synchronized RequestProcessor getRequestProcessor(ModuleConfig config); throws ServletException { /*看到synchronized了吧,虽然processor被放到了context中,但它也是线程安全的,而之前的线程安全性,属于every request per servlet instance的范畴,是由cotainer保证的。这里做了延续,做到了every request per RequestProcessor instance*/ String key = Globals.REQUEST_PROCESSOR_KEY + config.getPrefix();; RequestProcessor processor = (RequestProcessor); getServletContext();.getAttribute(key);; if (processor == null); { try { processor = (RequestProcessor); RequestUtils.applicationInstance( config.getControllerConfig();.getProcessorClass(););; } catch (Exception e); { throw new UnavailableException( "Cannot initialize RequestProcessor of class " + config.getControllerConfig();.getProcessorClass(); + ": " + e);; } processor.init(this, config);; getServletContext();.setAttribute(key, processor);; } return (processor);; } /* 然后又跟踪到org.apache.struts.action.RequestProcessor 和 org.apache.struts.action.Action,都没有发现struts引入任何线程安全问题。 */ 所以我们要处理存入session和servletContext中的数据的时候,要注意自己保证线程安全性。 weihello 写道 webwork就不会有这个问题了。 不知道webwork是如何屏蔽掉session中属性线程安全的问题的,愿闻其详。 |
|
返回顶楼 | |