38

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

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

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

现在回答我的问题...

  • 你什么时候使用其中一个?
  • 使用一种方法比另一种方法有什么普遍的优势吗? (例如,通常推荐一种方法而不是另一种方法吗?)

[编辑]:强调关键字

4

3 回答 3

35

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

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

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

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

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

于 2013-05-08T11:44:59.030 回答
25

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)。

于 2015-03-30T11:32:03.547 回答
6

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

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

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

于 2013-05-08T11:31:34.337 回答