【问题标题】:Why do only one controller used to serve all incoming requests in Java?为什么只有一个控制器用于处理 Java 中的所有传入请求?
【发布时间】:2017-03-27 10:56:43
【问题描述】:

我来自 .NET 世界。非常肯定地知道,在 Web 应用程序 (MVC) 中,

.NET: 为每个传入请求创建一个新的控制器实例 到网络服务器并呈现结果。

更多详情请见SO Question & Answer

但是,我即将开发一个 Java Web 应用程序,听到这个消息我感到很震惊:

Java:一个控制器实例用于服务每个传入的 向网络服务器请求。 (单身人士)

我也用谷歌搜索得知上述说法是正确的。 Here

据我所知,MVC 是一个框架,独立于实现语言。

为什么会出现这种差异? 还是我错过了什么?

【问题讨论】:

  • @downvoters:请随时在投票中留下您的评论。
  • 在 java 中,您可以使用 1 个控制器来处理多个请求,或者为每个请求制作单独的控制器。这完全取决于您。
  • 你说得对,它是独立的。根据需要实现尽可能多的控制器是您的选择。我想你来自春天的一面。那里的框架已经实现,你必须使用它的结构。
  • @MarcelHöll 对此没有什么特别的春天。一个基本的Servlet 被重用,而不是每次都创建一个新实例。这意味着您不能在 servlet 中拥有状态,尽管听起来您也不能在 .NET 端拥有状态(但出于不同的原因)。
  • 不确定这个问题有多大用处。您正在尝试比较 2 个具有完全不同实现细节的不同框架。您似乎还暗示(尽管我可能错了)MVC 作为一个概念似乎偏向于一种或另一种方式,这是不准确的。 (不过,不是我的反对票)

标签: java c# asp.net-mvc spring spring-mvc


【解决方案1】:

我不知道为什么会出现这种情况的任何具体原因,但我能想到一些利弊。

Java 的优点

  • 避免在收到大量请求时创建可能影响事情的对象
  • 允许您将状态保留在控制器中

Java 的方式缺点

  • 允许您将状态保持在控制器内部。由于对象是多线程的,因此您必须确保您保留在控制器中的任何状态(强烈建议不要这样做)以线程安全的方式使用。这并不总是很明显,并且可能会导致错误。

.NET 的优点

  • 简单
  • 状态可以在请求期间保存在对象中(类似于“半全局变量”),无需任何特定的线程安全代码。下一个请求不可能看到前一个请求的状态(Java 不鼓励将状态保存在控制器中的原因之一)。

.NET 的方式缺点

  • 如果一次处理大量请求,可能是一个(次要)问题

可能还有其他人,但我能想到这些。差异很可能是由于设计决定,可能无法追踪。但是,正如 cmets 中所解释的,这两种方法都不是“正确的”。 MVC 并不需要其中一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 2018-01-13
    • 1970-01-01
    • 2011-01-17
    相关资源
    最近更新 更多