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