在不同的控制器中使用对象




这可能是一个愚蠢的问题,但我只是感到困惑。我有一个控制器,其中创建了一个对象,我想在其他几个控制器中使用该对象。
目前我的对象是一个类变量,当其他用户请求或会话请求时会被覆盖,我确定它不好并且会产生一些会话问题。让我们假设下面是我的方案:

    @Controller
    public class DemoController
    {
        /* CURRENTLY THIS IS WHAT I'M DOING BUT I DON'T WANT THIS VARIABLE GLOBAL*/
        private MyCommonObject myCommonObject = new MyCommonObject();

        @RequestMapping(value="/demo-one", method=RequestMethod.POST)
        public ModelAndView postControllerOne(@ModelAttribute SearchForm searchForm,
                ModelMap modelMap)
        {
            //I want to use this object in all other controllers too
            myCommonObject = someMethodToGetApiResult(searchForm);
            SomeOtherObject someOtherObject = getSomeObject(myCommonObject);
            modelMap.addAttribute("someOtherObject",someOtherObject);
            return new ModelAndView("/firstJSP");
        }
        @RequestMapping(value="/demo-two", method=RequestMethod.POST)
        public ModelAndView postControllerTwo(@ModelAttribute SomeForm someForm,
                ModelMap modelMap)
        {
            // Used the class variable here
            SomeOtherObject someOtherObject = getSomeObject(myCommonObject,someForm);
            modelMap.addAttribute("someOtherObject",someOtherObject);
            return new ModelAndView("/secondJSP");
        }
        @RequestMapping(value="/demo-three", method=RequestMethod.POST)
        public ModelAndView postControllerThree(@ModelAttribute SomeForm someForm,
                ModelMap modelMap)
        {
            // Used the class variable here
            SomeOtherObject someOtherObject = getSomeObject(myCommonObject,someForm);
            modelMap.addAttribute("someOtherObject",someOtherObject);
            return new ModelAndView("/thirdJSP");
        }
        @RequestMapping(value="/demo-four", method=RequestMethod.POST)
        public ModelAndView postControllerFour(@ModelAttribute SomeForm someForm,
                ModelMap modelMap)
        {
            // Used the class variable here
            SomeOtherObject someOtherObject = getSomeObject(myCommonObject,someForm);
            modelMap.addAttribute("someOtherObject",someOtherObject);
            return new ModelAndView("/fourthJSP");
        }
    }

谢谢。

DemoController是一个单例所有 Web 请求只有一个实例。

这意味着整个 Web 应用程序中只有一个myCommonObject值。谁击中/demo-one最后一个,谁就赢了,/demo-two/demo-four的所有命中都将使用最后一个实例,无论谁在做。

我假设MyCommonObject存储状态信息,否则为什么要做你想做的事情。每次有人点击 /demo-one 时,都会重置此状态对象。不能那样做。简而言之,不要在控制器中存储状态。

由于您希望每个客户端都有一个MyCommonObject实例,因此请将其存储在 HttpSession 中。

如果您使用的是集中式服务器,请将类声明为@Component和单例,并初始化一次对象。

如果您在包含多个服务器的分布式环境中工作,则每个服务器都有自己的实例。在这种情况下,您应该使用将保存类的外部服务器,并且所有其他服务器都将从该服务器接收值。

如果你想在

几个Controllers中使用你的myCommonObject,并且如果这个对象包含不特定于用户的状态(即作用域是整个Web应用程序),那么你可以在你的spring应用程序上下文中将其定义为一个bean(XML或Java配置,并且作用域单例),并在你想要的任何Controller使用它。

相关内容

  • 没有找到相关文章

最新更新