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应用程序集群,则共享它们。需要适当的逻辑来清除过时的预订。