何时使用 Servlet 或 @Controller

Posted

技术标签:

【中文标题】何时使用 Servlet 或 @Controller【英文标题】:When to use Servlet or @Controller 【发布时间】:2013-05-02 14:22:58 【问题描述】:

我需要弄清楚一些事情。我一直在寻找这个问题的答案,但我似乎无法为我的具体问题找到一个好的答案(例如,这个问题正在蚕食答案:Difference between servlet and web service)。

据我了解,您可以通过多种方式在“面向 MVC”的 Web 应用程序中实现“请求处理”,也就是“控制器”,其中两种是:

    特定于 Java 的 Servlet(即您通过单击新建创建的一个 -> Servlet,例如在 Eclipse 中),用作“控制器”。这个 扩展 HttpServlet 并使用 doGetdoPost 等方法。 一个 Spring MVC 注释的 @Controller 类(是的,使用 DispatcherServlet)。有了这个,您可以使用 @RequestMethod GET/POST 等。

现在我的问题...

您什么时候使用其中一种? 使用一种方法比另一种方法有什么一般优势吗? (例如,一般来说,推荐一种方法优于另一种方法吗?)

[编辑]:强调的关键字

【问题讨论】:

【参考方案1】:

Servlet 和 Spring MVC 控制器可用于做同样的事情,但它们作用于 Java 应用程序的不同级别

servlet 是 J2EE 框架的一部分,每个 Java 应用程序服务器(Tomcat、Jetty 等)都是为运行 servlet 而构建的。 Servlet 是 J2EE 堆栈中的“低级”层。您不需要 servlet.jar 来运行您的应用程序,因为它已与应用程序服务器预打包

Spring MVC 控制器是一个建立在 servlet 之上的库,可以让事情变得更简单。 Spring MVC 提供了更多的内置功能,例如表单参数到控制器方法参数的映射,更容易处理二进制表单提交(即当您的表单可以上传文件时)。您需要将所需的 jar 打包到您的应用程序中才能运行 Spring MVC 控制器

当您需要“低级”时,您应该使用 servlet,示例可能是出于性能原因。 Spring MVC 表现不错,但如果它有一些开销,如果您需要从应用程序服务器中挤出所有可能的内容(并且您已经调整了其他层,例如 db),请使用 servlet。如果您想了解 J2EE Web 规范的基础(即用于教育目的),您可以选择一个 servlet

在所有其他情况下,您可以/应该选择 Web 框架。 Spring MVC 就是其中之一;使用 Spring MVC,您无需重新发明***(即二进制表单管理、表单参数到 bean 转换、参数验证等)。 Spring MVC 的另一个优点是,在一个类中,您可以轻松管理来自不同 url 和方法的输入,在 servlet 中执行相同操作是可能的,但代码更复杂且可读性更低。 我的观点是 Spring MVC 有利于构建 rest 服务和管理简单的应用程序(即具有简单表单的 web 应用程序)。如果您需要使用 Ajax、嵌套表单以及具有会话和页面状态的应用程序来管理非常复杂的表单,我的建议是切换到基于组件的框架(例如 apache wicket)。

【讨论】:

【参考方案2】:

JSF 和 JSP 以及 Spring MVC 建立在 Servlet 之上。 servlet 的问题不是很“好”,因为您必须直接编写 html

如果您能够使用现代网络技术,我只会在需要直接 http 输出的位置使用 servlet,例如将图像从数据库写入 http。

使用与 Dipatcherservlet 或 FacesServlet 一起工作的 SpringMVC 或 JSF 更快,更有趣。他们解析您的文件并通过 servlet 发送。

【讨论】:

JPA 与 servlet 无关。 servlet 通常与 JSP 结合使用,就像 Spring MVC 控制器一样。 我的意思是 JSP 当我的意思是 JSP 时,我总是写 JPA。对不起。 @Templar 感谢您的回答!我仍然有点困惑。您会将@Controller (Spring MVC) 用于哪种应用程序,您会将“常规 servlet”用于哪种应用程序? 所有我不需要写直接httpstream的东西->@Controller将图像之类的资源写入httpstream->Servlet【参考方案3】:

如果您是一名有兴趣学习这门语言的学生,那么我现在会坚持使用 servlet。仅使用 servlet 编写 Web 应用程序是可能的,但实际上您可能还想查看 JSP。

JSP 是编写 servlet 的一种便捷方式,它允许您将 html 与脚本元素混合在一起(尽管建议在您的 jsp 中避免使用 Java 代码,而使用标签和 el 表达式)。在幕后,它将被编译为一个 servlet,但它避免了您必须使用大量凌乱的打印语句。

至少对 servlet 和 JSP 有基本的了解是很重要的。 Spring MVC 是构建在 servlet 之上的众多框架之一,旨在使编写 Web 应用程序的任务变得更容易一些。基本上所有请求都映射到充当front controller 的DispatcherServlet。

然后 DispatcherServlet 将调用注解匹配传入请求的控制器。这比必须自己在 web.xml 中编写这些映射更简洁(尽管使用 servlet 3.0 您现在可以注释 servlet)。但是您还可以获得许多其他可以使用的好处,例如将表单字段映射到对象,使用 jsr303 注释验证该对象,将输入和输出映射到 xml 或 json 等。此外,它与核心 spring 紧密集成,因此您可以轻松连接供控制器调用的服务。

值得注意的是,在 servlet 之上构建了许多相互竞争的框架。 Spring MVC 是最流行的一种,因此它是一个不错的选择。

【讨论】:

很好的解释!我对事物如何单独工作有基本的了解,只是我无法真正确定何时使用任何一种方法。您解释了两者之间的差异,但没有详细说明它们的实际使用领域。你能举出任何我会使用一种方法而不是另一种方法的例子吗? 它们都用于相同的事情(创建网络应用程序)。不同之处在于 Spring MVC 增加了很多便利。大多数编写 Java Web 应用程序的人会使用在 servlet 之上编写的某种框架来简化开发。例如。如果您突然有一个请求返回 json 的用例,那么 spring mvc 已经支持它,而对于 servlet,您必须自己弄清楚。了解 servlet 仍然很有用,因为它是底层技术。 我明白了。所以基本上一个 servlet 是用这两种方法创建的,做完全相同的事情——只是在#2 中你使用 Spring MVC 作为框架来帮助你?也就是说,在 Spring MVC 的 @Controller、DispatcherServlet 和一些 JSP(“java in html”)的帮助下,您可以创建与创建 Servlet(“html in java”(即 New -> Servlet. ..)) 和你自己的一些 JSP/html,只是在 Spring MVC 的情况下,Spring 会“免费”处理 servlet 业务的“讨厌的部分”?这会是对这一切的正确理解吗? (抱歉有点慢:) 差不多。没错,在这两种情况下,您都需要一个 JSP 来呈现视图。通常,控制器或 servlet 将调用您的服务来获取/设置数据,将其保存在请求中,然后转发到 jsp。 Spring MVC 也可以通过它的视图解析器来帮助找到正确的视图。

以上是关于何时使用 Servlet 或 @Controller的主要内容,如果未能解决你的问题,请参考以下文章

何时使用 Spring @Async vs Callable 控制器(异步控制器,servlet 3)

Spring原理之MVC

SpringMVC 获得请求数据 -- 获得Servlet相关API获得请求头(@RequestHeader@CookieValue)

Servlet讲解

Servlet的生命周期

Servlet 随记: