何时使用 Servlet 或 @Controller

2022-09-01 03:44:17

我需要弄清楚一些事情。我一直在寻找这个问题的答案,但我似乎找不到我的具体问题的好答案(例如,这个问题正在蚕食答案:servlet和Web服务之间的区别)。

据我所知,在“面向MVC”的Web应用程序中,您可以通过不同的方式实现“请求处理”,也称为“控制器”,其中两种是:

  1. 一个特定于Java的Servlet(即通过单击new -> Servlet创建的Servlet,例如在eclipse中),用作“控制器”。这个扩展,你使用像和等方法。HttpServletdoGetdoPost
  2. 带注释的弹簧 MVC @Controller类(是的,使用 )。有了这个,你使用/等。DispatcherServlet@RequestMethodGETPOST

现在回答我的问题...

  • 您何时使用其中一个?
  • 使用一种方法是否比使用另一种方法有什么一般优势?(例如,一般来说,是否推荐一种方法而不是另一种方法?

[编辑]:强调关键字


答案 1

如果你是一个有兴趣学习这门语言的学生,那么我现在会坚持使用servlets。可以只使用 servlet 编写 Web 应用程序,但在实践中,您可能也想看看 JSP。

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

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

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

值得注意的是,在servlet之上构建了大量相互竞争的框架。Spring MVC是最受欢迎的之一,因此研究它不是一个糟糕的选择。


答案 2

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适用于构建休息服务和管理简单的应用程序(即具有简单表单的Web应用程序)。如果您需要使用Ajax,嵌套表单以及同时具有会话和页面状态的应用程序来管理非常复杂的表单,我的建议是切换到基于组件的框架(例如apache wicket)。


推荐