【问题标题】:Spring MVC Without Servlets没有 Servlet 的 Spring MVC
【发布时间】:2013-12-01 16:00:24
【问题描述】:

我是 Spring MVC 的新手(以前使用过 Rails 和 ASP.NET MVC)。我注意到我仍然必须使用 servlet。据我所知,Spring 要求您使用 servlet——您不能将它换成不同的视图引擎(如 Apache Velocity)。

是否可以将 Spring MVC 与不同的视图引擎一起使用?我似乎找不到任何关于此的材料。

【问题讨论】:

    标签: spring-mvc


    【解决方案1】:

    有些混乱。

    1. Spring MVC 不能没有 servlet,因为 Spring MVC 是建立在 Servlet 技术之上的。 (但这不是问题,因为您可以拥有其他视图技术。)
       
    2. 您将视图技术与 servlet 混淆了。
      • 有几种可能的视图技术。
      • 如果有什么,servlet 是控制器,而不是视图(实际上,Spring MVC 遵循Model 2 MVC,所以 servlet 不是控制器 与标准 MVC 模式中使用的含义相同)。

    Spring 框架有一章专门介绍查看技术:http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/view.html

    您可以在此处找到信息以及如何配置多种视图技术,例如:

    但不要局限于该指南。那里没有列出其他视图技术(因为视图机制非常灵活和可扩展)。 Thymeleaf 就是一个很好的例子,但没有列出。


    我将尝试澄清 Servlet 与控制器的问题:

    MVC 模式

    “标准”MVC 模式的工作原理如下图所示:

    混淆的第一个来源是尝试将 Spring MVC(因为名称)“适配”到这个 MVC 中。这通常会导致错误,因为 Spring MVC 更适合这种模式的变体,如下所述。

    关于这个问题,我的意思是:如果你真的只想考虑这种 MVC 模式,那么 Servlet 更像是控制器,而不是视图。

    模型 2 MVC 模式

    准确地说,如前所述,Spring MVC 并不遵循“标准”MVC,实际上它更符合Model 2 MVC,其中还包括一个前端控制器组件到已经存在的(模型、视图和控制器),如图像:

    现在,在 Model 2 MVC 中,Servlet 不是控制器组件。它们是Front Controller(其实org.springframework.web.servlet.DispatcherServlet就是前端控制器)。

    在这张照片中:

    • 前端控制器org.springframework.web.servlet.DispatcherServlet
    • Controller是你的类(通常用@Controller注解)。
    • View Template 是一个 JSP/VM/HTML 文件,将根据 Model 由您选择的视图技术(如在 JSP、Tiles、Velocity、Thymeleaf 之前列出的...... - 不是 Servlets)。
    • 模型是来自您的域的数据(对象),从控制器传递到视图。

    最常用的视图引擎是什么?

    这是一个非常相关的问题。 Spring 参考中列出的所有内容都非常受欢迎。除了它们,Thymeleaf 是我所知道的另一个非常好的产品。

    说一个比另一个更好是不公平的,最终决定将取决于您项目的需求。不过,对于我使用过的那些,这是我的两分钱:

    • JSP 是最古老的(同时也是好坏参半),也是最快的之一,但可能非常冗长,并且允许在页面中使用 Java sn-ps。
    • JSTL 使 JSP 页面的语法更好,但以性能为代价。
    • Freemarker and Velocity 看起来很像,速度非常快,语法与 JSP 不同(是否更清晰可能是个人意见),并且具有非常好的模板系统。
    • 我没用过Tiles,但听说他们的模板和组件化非常好。
    • Thymeleaf 押注于拥有非常可维护的 HTML,并且是一个非常健康的项目,社区正在不断壮大。见Thymeleaf vs. JSP

    【讨论】:

    • 你是对的。我几乎删除了我的问题,因为它没有意义。此页面解释了 servlet 在此架构中充当控制器:viralpatel.net/blogs/…
    • @Crowie / ashes999:我已经更新了答案,试图解决您的 cmets 提出的问题。如果他们不够清楚,请告诉我。
    • 看起来不错。我忘记了调度程序 servlet/前端控制器的关系
    • 感谢您的意见。我会试试 Thymeleaf。
    • 最后一点:Thymeleaf 很棒,但是如果您从 Spring MVC 开始,也许使用纯 JSP 会让您更快、更轻松,因为那里有大量资源。我建议我采取的路径:从 JSP 开始,更好地了解一些东西(Spring Security、Spring Validation),然后继续学习 thymeleaf。将来,每当发布某些东西时,人们总是使用纯 JSP 创建示例,但现在总是使用 Thymeleaf 或其他视图技术。
    【解决方案2】:

    Servlet API 不是视图引擎,它是用于处理 HTTP 请求的 API。换句话说,它是 Web 服务器(servlet 容器)用来将 HTTP 请求传递给您的应用程序并发送回响应的接口。

    Spring MVC 可以与不同的视图引擎一起使用:JSP、Thymeleaf、Velocity 等。您甚至可以使用静态 HTML 页面(如果您的应用程序纯粹基于 AJAX)。

    【讨论】:

      猜你喜欢
      • 2016-04-18
      • 1970-01-01
      • 2012-04-09
      • 1970-01-01
      • 1970-01-01
      • 2017-10-01
      • 1970-01-01
      • 2018-05-17
      • 2016-05-27
      相关资源
      最近更新 更多