论坛首页 Java企业应用论坛

一个关于DispatchAction中私有变量的问题

浏览 7751 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2004-10-12  
public class MyAction extends DispatchAction{

private List myList;

.....

}

现在的问题是:对于不同的用户 myList 竟然是相同的!!也就是说 myList 是所有调用MyAction的用户共享的(我的理解,不知道对不对)

而我的系统要求是不同的用户有自己的 myList 内容,不知道大家有没有碰到过这样的问题,是怎么解决的。

谢谢了先:)
   发表时间:2004-10-12  
Struts的Action不是线程安全的。
0 请登录后投票
   发表时间:2004-10-12  
那有没有好的解决办法呢?

因为之前的项目中一直这样使用,现在才发现问题了:(

看来代码得从头改了。。。。瀑布汗

怎么才能让其属于线程安全呢?
0 请登录后投票
   发表时间:2004-10-12  
在Action中,通常是不建议通过属性来实现method之间的数据共享的。也就是说,在Action中,你就不应该有这种属性存在。把属性挪到method的局部变量里面去吧。
0 请登录后投票
   发表时间:2004-10-12  
webwork就不会有这个问题了。

想起前年的一个同事用Struts做的一个程序,潜在一个这样的bug,不过还好这个功能用得少之又少。
0 请登录后投票
   发表时间:2004-10-12  
robbin 写道
在Action中,通常是不建议通过属性来实现method之间的数据共享的。


难道method之间的数据共享只能通过session吗?这样session中岂不有太多的"垃圾"信息---如果不自己及时清理的话

有没有其他的共享数据的办法啊?
0 请登录后投票
   发表时间:2004-10-12  
半价优惠 写道
robbin 写道
在Action中,通常是不建议通过属性来实现method之间的数据共享的。


难道method之间的数据共享只能通过session吗?这样session中岂不有太多的"垃圾"信息---如果不自己及时清理的话

有没有其他的共享数据的办法啊?


通过参数传递和返回值来共享数据。当然,request, session也可以的。
0 请登录后投票
   发表时间:2004-10-12  
DispatchAction 中的method的返回值和参数说白了就是request和session了............

唉~当初怎么没早早发现这个问题呢.没办法,从头改代码把:(
0 请登录后投票
   发表时间:2004-10-13  
class xxx{
//得到当前时间
private Timestamp currTime= new Timestamp(System.currentTimeMillis());
.....
}
我以前也遇到过这种问题,结果所有用户看到的时间都是一样的。
后来就把这个变量放到method中了,幸好发现的早,返工的工作量还不算大。
我的理解是:
struts中一个类只会有一个实例在运行,所以造成所有的用户看到的都是同样的东西。不知道这样理解对不对?
0 请登录后投票
   发表时间: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中属性线程安全的问题的,愿闻其详。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics