1.Introduction to Spring Web MVC framework

Web MVC framework

文档:22. Web MVC framework (spring.io)

概述

Web MVC框架(Web Model-View-Controller Framework)是一种用于构建Web应用程序的软件架构模式。MVC模式将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。这种分离有助于组织代码和简化开发和维护过程。以下是MVC框架的三个主要组件的详细说明:

  1. 模型(Model)
    • 职责:模型负责处理应用程序的数据逻辑。它直接与数据库或其他数据源进行交互,执行数据的创建、读取、更新和删除操作。
    • 功能:模型通常包含应用程序的核心业务逻辑和数据验证规则。
  2. 视图(View)
    • 职责:视图负责呈现数据给用户。它获取来自模型的数据,并将其格式化为HTML或其他前端技术以显示在网页上。
    • 功能:视图只负责展示数据,不处理业务逻辑或数据操作。
  3. 控制器(Controller)
    • 职责:控制器充当模型和视图之间的中介。它接收用户输入(如通过表单提交或URL请求),处理这些输入,通过模型更新数据,然后选择合适的视图来展示结果。
    • 功能:控制器通常包含路由和处理用户请求的逻辑。

Web MVC 框架的优势

  • 分离关注点:MVC模式将应用程序的不同部分分离开来,使代码更加模块化和可维护。
  • 重用性和灵活性:由于模型、视图和控制器是独立的模块,可以更容易地重用和替换其中的部分。
  • 并行开发:开发团队可以并行工作,例如前端开发人员可以专注于视图的设计,而后端开发人员则可以处理业务逻辑和数据。

常见的Web MVC框架

  • Java:Spring MVC
  • Python:Django、Flask(尽管Flask不是严格的MVC框架,但可以遵循MVC模式)
  • Ruby:Ruby on Rails
  • JavaScript:Express.js(通常用于Node.js)

这些框架通常提供了一整套工具和库,帮助开发人员更快速地构建、测试和部署Web应用程序。

Spring Web MVC Framework 简介

Spring Web MVC框架是基于DispatcherServlet设计的,负责将请求分发给处理程序。它提供可配置的处理器映射、视图解析、区域设置、时区和主题解析,还支持文件上传。默认的处理器基于@Controller和@RequestMapping注解,提供了一系列灵活的处理方法。Spring 3.0引入了RESTful网站和应用程序的支持,通过@PathVariable注解和其他特性实现。

核心设计原则

一个关键的设计原则是"对扩展开放,对修改关闭"(Open for extension, closed for modification)。在Spring Web MVC及其整体设计中,这一原则得到了充分体现。

Spring Web MVC的一些核心类的方法被标记为final,开发人员不能重写这些方法以提供自己的行为。这并非随意为之,而是为了遵循上述设计原则。

参考文献

有关这一原则的解释,可以参考Seth Ladd等人的《Expert Spring Web MVC and Web Flow》,特别是第一页117的"设计一瞥"部分。另请参阅Bob Martin的《开放封闭原则》(PDF)。

不能为final方法添加advice

在使用Spring MVC时,不能为final方法添加advice。例如,不能为AbstractController.setSynchronizeOnSession()方法添加advice。有关AOP代理及为什么不能为final方法添加advice的更多信息,请参阅"理解AOP代理"一节。

Spring Web MVC的功能

  1. 命令对象和表单绑定
    • 在Spring Web MVC中,任何对象都可以作为命令或表单绑定对象。开发人员无需实现特定的框架接口或基类。
    • Spring的数据绑定非常灵活。例如,它将类型不匹配视为验证错误,而不是系统错误。因此,无需在表单对象中将业务对象的属性重复为简单的无类型字符串以处理无效提交,或正确转换字符串。相反,通常直接绑定到业务对象更为合适。
  2. 视图解析
    • Spring的视图解析非常灵活。一个Controller通常负责准备包含数据的模型Map和选择视图名称,但它也可以直接写入响应流并完成请求。
    • 视图名称解析高度可配置,可以通过文件扩展名或Accept头内容类型协商、bean名称、属性文件或自定义ViewResolver实现来完成。
    • 模型(MVC中的M)是一个Map接口,允许完全抽象视图技术。可以直接与基于模板的渲染技术(如JSP、Velocity和Freemarker)集成,或直接生成XML、JSON、Atom等多种类型的内容。模型Map可以简单地转换为适当的格式,例如JSP请求属性、Velocity模板模型等。

通过这些特性,Spring Web MVC框架提供了高度的灵活性和可扩展性,使开发人员可以更方便地构建和维护Web应用程序。

Spring Web MVC 特性

Spring Web MVC框架提供了一系列强大的特性,使其在构建和管理Web应用程序时非常灵活和高效。以下是Spring Web MVC的一些主要特性:

  1. 角色的明确分离
    • 各个角色(如控制器、验证器、命令对象、表单对象、模型对象、DispatcherServlet、处理器映射、视图解析器等)都可以由专门的对象来完成。这种分离有助于代码的组织和维护。
  2. 强大而简洁的配置
    • 框架和应用程序类可以作为JavaBeans进行配置。这种配置能力包括在不同上下文之间的轻松引用,例如从Web控制器到业务对象和验证器。
  3. 适应性、非侵入性和灵活性
    • 可以根据需要定义任何控制器方法签名,可能使用参数注解(如@RequestParam、@RequestHeader、@PathVariable等)来适应特定场景。
  4. 可重用的业务代码
    • 使用现有的业务对象作为命令或表单对象,而不是将它们镜像到特定框架的基类。这避免了代码重复。
  5. 可定制的绑定和验证
    • 类型不匹配被视为应用级别的验证错误,保留了有问题的值,支持本地化的日期和数字绑定等,而不是仅仅使用字符串形式的表单对象并手动解析和转换为业务对象。
  6. 可定制的处理器映射和视图解析
    • 处理器映射和视图解析策略范围从简单的基于URL的配置到复杂的、专门构建的解析策略。Spring比那些要求使用特定技术的Web MVC框架更灵活。
  7. 灵活的模型传输
    • 使用名称/值Map的模型传输支持与任何视图技术的轻松集成。
  8. 可定制的区域设置、时区和主题解析
    • 支持使用或不使用Spring标签库的JSP、支持JSTL、支持Velocity而无需额外的桥接等。
  9. 简单但强大的JSP标签库
    • Spring标签库提供了对数据绑定和主题等功能的支持。自定义标签允许在标记代码方面具有最大的灵活性。
  10. JSP表单标签库
    • Spring 2.0引入的JSP表单标签库使在JSP页面中编写表单变得更加容易。
  11. 基于HTTP请求或HTTP会话的bean生命周期
    • 这种特性不是Spring MVC本身的特有功能,而是Spring MVC使用的WebApplicationContext容器的功能。此类bean作用域包括请求、会话、全局会话、应用程序和WebSocket作用域。

Spring Web Flow(SWF)

Spring Web Flow(SWF)旨在成为管理Web应用程序页面流程的最佳解决方案。SWF与现有的框架(如Spring MVC和JSF)集成,可以在Servlet和Portlet环境中使用。如果有一个或多个业务流程受益于对话模型而不是纯请求模型,那么SWF可能是解决方案。

SWF的特点

逻辑页面流:SWF允许将逻辑页面流捕获为自包含的模块,可以在不同情况下重用,非常适合构建引导用户通过受控导航以驱动业务流程的Web应用程序模块。

有关SWF的更多信息,请参阅Spring Web Flow网站

总结

​ Spring Web MVC和Spring Web Flow提供了高度灵活和可扩展的解决方案,用于构建和管理Web应用程序。通过明确分离角色、强大的配置能力和广泛的可定制选项,Spring Web MVC为开发人员提供了一个强大的工具集。而Spring Web Flow则通过管理页面流和对话状态,为复杂的Web应用程序提供了更高级的功能。

其他MVC实现的可插拔性

在某些项目中,非Spring MVC实现可能更适合。例如,许多团队希望利用他们在JSF等技能和工具上的现有投资。如果不想使用Spring的Web MVC,但打算利用Spring提供的其他解决方案,可以轻松地将你选择的Web MVC框架与Spring集成。

相关推荐
我叫白小猿4 分钟前
【日常记录-JS】HTML动态加载JS脚本
前端·javascript·html·验签·动态加载
Array[赵]14 分钟前
Vue 使用elementUI-plus el-calendar加 公历转农历 是否节假日 等
前端·javascript·vue.js
q5673152334 分钟前
如何在 Python 中测试文件修改
开发语言·前端·python·mysql·正则表达式
偷得浮生半日闲@1 小时前
Vue屏蔽打印信息
前端·javascript·vue.js
雷特IT1 小时前
前端HTML总结
前端·html
天涯学馆1 小时前
GraphQL Subscriptions与WebSocket
前端·javascript·websocket·前端框架·graphql
光影少年1 小时前
React 常用 Hooks 和使用的易错点
前端·react.js·前端框架
极客小张1 小时前
打造智能家居:用React、Node.js和WebSocket构建ESP32设备控制面板(代码说明)
前端·单片机·物联网·网络协议·react.js·node.js·智能家居
一只懒鱼a1 小时前
SpringBoot之外部化配置
java·spring boot·后端·spring
张天龙1 小时前
【SpringBoot】数据验证之分组校验
java·服务器·前端·spring boot