当前位置: 首页 > news >正文

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集成。

相关文章:

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&am…...

Onnx 1-深度学习-概述1

Onnx 1-深度学习-概述1 一: Onnx 概念1> Onnx 介绍2> Onnx 的作用3> Onnx 应用场景4> Onnx 文件格式1. Protobuf 特点2. onnx.proto3协议3> Onnx 模型基本操作二:Onnx API1> 算子详解2> Onnx 算子介绍三: Onnx 模型1> Onnx 函数功能1. np.random.rand…...

网络基础——udp协议

UDP协议(User Datagram Protocol,用户数据报协议)是OSI(Open System Interconnection,开放式系统互联)参考模型中一种无连接的传输层协议,它提供了一种简单的、不可靠的数据传输服务。以下是关于…...

分布式锁理解

介绍分布式锁,我觉得从项目的背景入手把 在伙伴匹配系统中,我创建了一个定时任务,做为缓存预热的手段 这个具体原因在Redis-CSDN博客 接下来切入正题: 想象每个服务器都有一个定时任务,都要对数据库或者缓存进行操…...

Android Gradle 开发与应用 (十): Gradle 脚本最佳实践

目录 1. 使用Gradle Kotlin DSL 1.1 什么是Gradle Kotlin DSL 1.2 迁移到Kotlin DSL 1.3 优势分析 2. 优化依赖管理 2.1 使用依赖版本管理文件 2.2 使用依赖分组 3. 合理使用Gradle插件 3.1 官方插件和自定义插件 3.2 插件管理的最佳实践 4. 任务配置优化 4.1 使用…...

c#获取本机的MAC地址(附源码)

在前一次的项目中,突然用到了这个获取本机的MAC地址,然后就研究了一下,记录下来,防止以后再用到, 使用winfrom做的,界面一个button,一个textBox,点了button以后给textBox赋值显示mac地址 附上源…...

sqlmap使用之-post注入、head注入(ua、cookie、referer)

1、post注入 1.1、方法一,通过保存数据包文件进行注入 bp抓包获取post数据 将数据保存到post.txt文件 加上-r指定数据文件 1.2、方法二、通过URL注入 D:\Python3.8.6\SQLmap>python sqlmap.py -u "http://localhost/login.php" --data "userna…...

XSS: 原理 反射型实例[入门]

原理 服务器未对用户输入进行严格校验,使攻击者将恶意的js代码,拼接到前端代码中,从而实现恶意利用 XSS攻击危害 窃取用户Cookie和其他敏感信息,进行会话劫持或身份冒充后台增删改文章进行XSS钓鱼攻击利用XSS漏洞进行网页代码的…...

Idea新增Module报错:sdk ‘1.8‘ type ‘JavaSDK‘ is not registered in ProjectJdkTable

文章目录 一,创建Module报错二,原因分析三,解决方案1,点击上图的加号,把JDK8添加进来即可2,点击左侧[Project],直接设置SDK为JDK8 四,配置检查与验证 一,创建Module报错 …...

基于RHCE基础搭建简单服务

目录 项目标题与需求一 配置IP地址server机node02机 二 配置web服务三 搭建dns服务器四 开启防火墙server firewalld 五 配置nfs服务器node02 nfsserver autofs 六 开启SELinux七 验证是否能访问www.rhce.com 项目标题与需求 项目标题: 项目需求: 现有…...

威纶通触摸屏软件离线仿真时出现报错8000端口占用或服务器断线

现象 威纶通触摸屏软件离线仿真时出现报错 显示8000端口被占用 或者是设备服务器断线的状态 处理方法 系统参数——HMI属性 端口号更改一下即可 或者关闭占用8000端口的应用 分享创作不易,请多多支持,点赞、收藏、关注! Ending~...

CAS详解

文章目录 CAS使用示例Unsafe类实现原理CAS问题 CAS CAS全称为Compare and Swap被译为比较并交换,是一种无锁算法。用于实现并发编程中的原子操作。CAS操作检查某个变量是否与预期的值相同,如果相同则将其更新为新值。CAS操作是原子的,这意味…...

【笔记】虚拟机中的主从数据库连接实体数据库成功后的从数据库不同步问题解决方法2

错误: Last_Errno: 1008 Last_Error: Coordinator stopped because there were error(s) in the worker(s). The most recent failure being: Worker 1 failed executing transaction ANONYMOUS at source log mysql-bin.000014, end_log_pos 200275. See error lo…...

【每日一练】python类和对象现实举例详细讲解

""" 本节课程目的: 1.掌握类描述现实世界实物思想 2.掌握类和对象的关系 3.理解什么事面向对象 """ #比如设计一个闹钟,在这里就新建一个类 class Clock:idNone #闹钟的序列号,也就是类的属性priceNone #闹…...

【学习css1】flex布局-页面footer部分保持在网页底部

中间内容高度不够屏幕高度撑不开的页面时候&#xff0c;页面footer部分都能保持在网页页脚&#xff08;最底部&#xff09;的方法 1、首先上图看显示效果 2、奉上源码 2.1、html部分 <body><header>头部</header><main>主区域</main><foot…...

Java中创建线程的几种方式

底层都是基于实现Runnable接口 1.继承thread类&#xff0c;new一个thread对象&#xff0c;实现run方法&#xff0c;无返回值 public class MyThread extends Thread {Overridepublic void run() {System.out.println("Thread created by extending Thread class is runn…...

[A-04] ARMv8/ARMv9-Cache的相关策略

ver0.2 前言 前面我们已经通过三篇文章反反复复的讲Cache的概念、结构、架构&#xff0c;相信大家对Cache已经大概有了初步的了解。这里简单归纳一下: (1) Cache从硬件视角看&#xff0c;是连接PE-Core和主存的一种存储介质&#xff0c;存储的数据是主存中数据的副本&#xf…...

【笔试常见编程题06】最近公共祖先、求最大连续bit数、二进制插入、查找组成一个偶数最接近的两个素数

1. 最近公共祖先 将一棵无穷大满二叉树的结点按根结点一层一层地从左往右编号&#xff0c;根结点编号为1。现给定a&#xff0c;b为两个结点。设计一个算法&#xff0c;返回a、b最近的公共祖先的编号。注意其祖先也可能是结点本身。 测试样例&#xff1a; 2&#xff0c;3 返回&a…...

【工具分享】Gophish——网络钓鱼框架

文章目录 Gophish安装方式功能简介 Gophish Gophish 是一个开源的网络钓鱼框架&#xff0c;它被设计用于模拟真实世界的钓鱼攻击&#xff0c;以帮助企业和渗透测试人员测试和评估他们的网络钓鱼风险。Gophish 旨在使行业级的网络钓鱼培训对每个人都是可获取的&#xff0c;它易…...

“职业三大底层逻辑“是啥呢?

大家好&#xff0c;我是有用就扩散。 掌握职业发展的三大底层逻辑以宏观视角看待自己的职业发展道路具备长远规划自己职业路劲的能力通过成就事件呈现自己的工作成绩 一、痛点陈述 不喜欢眼前的工作&#xff1f;眼前的工作琐碎没前途&#xff1f;找不到能力提升的方向时候会…...

交叉调整率差的5大根源—变压器、绕组、反馈、拓扑、元件

Q1&#xff1a;导致交叉调整率差的第一大根源是什么&#xff1f;变压器漏感与绕组耦合不良。漏感使能量不能完全传递到辅路&#xff0c;各绕组漏感不一致&#xff0c;负载变化时电压漂移更明显。耦合系数越接近 1&#xff0c;交叉调整率越好。Q2&#xff1a;绕组绕制方式对交叉…...

Skills 如何高效地扩展 Claude 的能力

在模块化配置体系中&#xff0c;rules&#xff08;规则&#xff09;决定了 Claude 的下限&#xff08;不能搞砸什么&#xff09;&#xff0c;而 skills&#xff08;技能&#xff09;则决定了 Claude 的上限&#xff08;能多快、多准地完成复杂任务&#xff09;。高效扩展 Claud…...

别再死记硬背了!用Multisim仿真带你玩转计数器与数据选择器(附FPGA引脚配置)

用Multisim仿真与FPGA实战&#xff1a;计数器与数据选择器的设计艺术 数字电路课程中那些抽象的概念&#xff0c;是否曾让你感到困惑&#xff1f;模5计数器、序列信号发生器这些名词听起来高深莫测&#xff0c;但通过Multisim仿真和FPGA实战&#xff0c;你会发现它们其实可以很…...

告别复杂状态机:用C语言结构体数组为STM32设计可维护的多级菜单

用结构体数组重构STM32菜单系统&#xff1a;从状态机到模块化设计的进阶之路 在嵌入式开发中&#xff0c;菜单系统是许多产品不可或缺的交互界面。传统的状态机或switch-case实现方式虽然直接&#xff0c;但随着功能迭代&#xff0c;代码往往会变得臃肿难维护。我曾接手过一个使…...

Linux文件IO编程实战:用GEC6818开发板上的C程序玩转open/read/write/lseek

Linux文件IO编程实战&#xff1a;GEC6818开发板上的C语言文件操作精要 在嵌入式Linux开发中&#xff0c;文件操作是最基础也是最重要的技能之一。GEC6818作为一款广泛应用于教学和工业场景的开发板&#xff0c;其Linux系统编程能力尤为关键。本文将带你深入理解Linux"一切…...

别再说‘差不多’了!搞懂PPM,你的数字电路时钟才算真的稳了(附计算器)

别再说‘差不多’了&#xff01;搞懂PPM&#xff0c;你的数字电路时钟才算真的稳了&#xff08;附计算器&#xff09; 在数字电路设计中&#xff0c;时钟信号如同人体的心跳&#xff0c;其稳定性直接决定了整个系统的可靠性。然而&#xff0c;许多工程师在面对"PPM"这…...

从休眠到唤醒:深入解读AUTOSAR CanNm的Bus Load Reduction与Immediate Restart机制

从休眠到唤醒&#xff1a;深入解读AUTOSAR CanNm的Bus Load Reduction与Immediate Restart机制 在新能源汽车和智能座舱快速发展的今天&#xff0c;车载电子系统的功耗优化与实时响应能力成为工程师面临的核心挑战。AUTOSAR CanNm模块作为车载网络管理的关键组件&#xff0c;其…...

避开这些坑!用MATLAB做QPSK调制解调仿真时,你的成形滤波和匹配滤波设置对了吗?

QPSK仿真中的成形滤波与匹配滤波陷阱&#xff1a;MATLAB实战避坑指南 在数字通信系统的设计与验证过程中&#xff0c;MATLAB仿真扮演着至关重要的角色。许多工程师和研究人员在QPSK调制解调仿真中&#xff0c;常常遇到性能不达预期或结果与理论不符的情况。本文将深入剖析成形滤…...

【限时开放】CPython核心团队亲授:2026 Python原生AOT编译接入Checklist(含12个预编译hook校验点)

第一章&#xff1a;Python原生AOT编译方案2026的演进背景与核心价值近年来&#xff0c;Python在云原生、边缘计算与实时系统场景中的部署瓶颈日益凸显&#xff1a;CPython解释器的启动延迟、内存开销及运行时JIT缺失&#xff0c;严重制约了其在低延迟服务、嵌入式Python模块和安…...

知识管理工具选型指南:从Confluence、语雀到Notion、Sward的深度场景适配

1. 知识管理工具的核心价值与选型逻辑 第一次搭建团队知识库时&#xff0c;我犯了个典型错误——直接选了当时最火的工具。结果三个月后&#xff0c;技术团队抱怨Markdown支持太弱&#xff0c;产品团队嫌弃界面太复杂&#xff0c;最终这个价值十几万的系统成了摆设。这个教训让…...