2013-04-05 58 views
0

我开始为Web开发,我使用Spring MVC作为我的服务器框架。现在我想知道在Controller类中创建变量。我不得不这样做来管理服务器中的一些数据,但现在我关注以下情况:如果我有多个用户将信息发送到同一页面,同时,一个用户会干扰另一个用户变量?同一个控制器中的多个用户Spring MVC

下面是一些代码示例:

@Controller 
public Class myController { 

    int number; 


    @RequestMapping("/userInformation") 
    public String getInformation(int info) { 
     number = info; 
    } 

    public void doSomethingWithIt() { 
     number = number + 1; 
    } 

} 

在这种情况下,如果我有一个以上的用户在同一时间将数据发送到/ userInformation,将Spring MVC中为每个用户创建一个控制器?我猜这样我就没有问题了。但是,如果不是,我不得不重新考虑这个实施,不是吗?

回答

1

Spring容器将创建Controller的一个实例。因此,所有用户都将共享该实例。

如果您有数据,是私人用户,你有几种选择:

  1. 其存储在HTTP会话(不推荐,如果这是一个很大的数据,为您的内存使用可能会爆炸)
  2. 它存储在数据库中并检索它根据每个请求,根据一些属性标识所述用户
  3. 存储它在存储器中的高速缓存和检索它在每个请求的基础上,一些属性标识所述用户

选项3是其中最简单的选项,如果您愿意,您甚至可以在Controller上将它实现为Map<User, UserData>实例变量。这不是最干净,最美丽或最安全的选择,只是最简单的选择。

+0

谢谢!这是最完整的答案! – 2013-04-05 15:55:45

3

你说得对。控制器是单身人士,必须是无国籍的。服务器端状态属于会话中或数据存储区中。你也可以使用请求作用域对象(在春季查看bean作用域)。

0

您不应该在Spring控制器中使用任何表示控制器类的状态的实例变量。它从一个实例开始就不应该有状态。相反,您可以引用注入的托管bean。

+0

我不同意:Spring控制器可能有实例变量。如果你想使用另一个Spring bean,你希望Spring容器为你注入这个bean。如果bean在你的控制器中作为一个实例变量存在,那最容易实现。唯一的问题是,你的控制器上不应该有代表状态*的实例变量*。 – mthmulders 2013-04-05 14:18:21

+0

@mthmulders谢谢你,我的意思是......我会更新我的答案,以便更清楚地说明这一点! – user1697575 2013-04-05 14:20:15

相关问题