Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在不同的控制器中使用对象_Java_Spring_Spring Mvc_Global Variables - Fatal编程技术网

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

Java 在不同的控制器中使用对象,java,spring,spring-mvc,global-variables,Java,Spring,Spring Mvc,Global Variables,这可能是个愚蠢的问题,但我只是感到困惑。 我有一个创建对象的控制器&我想在其他几个控制器中使用该对象。目前,我的对象是一个类变量,在发出其他用户请求或会话请求时会被覆盖,我确信这不好&会造成一些会话问题。 让我们假设下面是我的场景: @Controller public class DemoController { /* CURRENTLY THIS IS WHAT I'M DOING BUT I DON'T WANT THIS VARIABLE GLOB


这可能是个愚蠢的问题,但我只是感到困惑。 我有一个创建对象的控制器&我想在其他几个控制器中使用该对象。
目前,我的对象是一个类变量,在发出其他用户请求或会话请求时会被覆盖,我确信这不好&会造成一些会话问题。 让我们假设下面是我的场景:

    @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");
        }
    }

谢谢。

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


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

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


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

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

这意味着整个webapp中只有一个
myCommonObject
值。无论谁最后点击了
/demo one
都将获胜,所有点击了
/demo two
/demo four
的人都将使用最后一个实例,不管是谁在做

我假设
MyCommonObject
存储状态信息,否则为什么要执行您试图执行的操作。每当有人点击
/demo one
时,就会重置此状态对象。不能那样做。简而言之,不要将状态存储在控制器中


因为您希望每个客户端都有一个
MyCommonObject
实例,所以将其存储在
HttpSession

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

这意味着整个webapp中只有一个
myCommonObject
值。无论谁最后点击了
/demo one
都将获胜,所有点击了
/demo two
/demo four
的人都将使用最后一个实例,不管是谁在做

我假设
MyCommonObject
存储状态信息,否则为什么要执行您试图执行的操作。每当有人点击
/demo one
时,就会重置此状态对象。不能那样做。简而言之,不要将状态存储在控制器中


由于您希望每个客户端都有一个
MyCommonObject
实例,如果您希望在多个
控制器中使用
MyCommonObject
,并且该对象持有非特定于用户的状态(即作用域是整个web应用程序),请将其存储在
HttpSession

中,然后,您可以在spring应用程序上下文(XML或Java配置和作用域单例)中将其定义为一个bean,并在您想要的任何
控制器中使用它。

如果您想在多个
控制器中使用
myCommonObject
,并且如果该对象持有非特定于用户的状态(即作用域是整个web应用程序),然后您可以在spring应用程序上下文中将其定义为bean(XML或Java配置和作用域单例)你可以随意使用它。

如果你修改缩进使代码可读,我可能会查看代码。@Andreas这样做了。代码是在stack的编辑器上编写的,而不是在某个IDE上。如果能找到解决方案,我会很高兴。如果你修改缩进使代码可读,我可能会查看代码代码。@Andreas这样做了。在stack的编辑器上编写了该代码,而不是在某个IDE上。如果能找到解决方案,我会很高兴。事实上,我正在构建一个航班预订web应用程序。在第一个控制器中,我收到来自任何搜索API的响应。我需要该响应对象用于接下来的3个步骤,即定价、预订和票务。它是诚然,我可以在会话中存储对象(虽然响应对象太重),但是如果用户从两个不同的系统登录,该怎么办?在这种情况下,最后一次搜索仍然存在,那么您需要将未完成的预订存储在由用户id键入的全局映射中。映射可以位于静态字段中,即单例的实例字段中您可以考虑将它们存储在数据库中,这样它们就可以通过重新启动WebApp服务器来持久化,并且如果您集群(非常流行),则共享它们。webapp。需要适当的逻辑来清除过时的预订。实际上,我正在构建一个航班预订web应用程序。在第一个控制器中,我收到来自任何搜索API的响应。我需要该响应对象用于接下来的3个步骤,即定价、预订和票务。我确实可以在会话中存储该对象(虽然响应对象太重),但如果用户从两个不同的系统登录,该怎么办?在这种情况下,最后一次搜索仍然存在,那么您需要将未完成的预订存储在全局地图中,由用户id键入。地图可以位于静态字段中,也可以是单例的实例字段(如控制器)在servlet应用程序属性中,您也可以考虑将它们存储在数据库中,因此它们通过重新启动WebApp服务器来持久化,如果您将(非常受欢迎)的Web应用程序集群,则共享它们。需要适当的逻辑来清除过时的预订。