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框架的三个主要组件的详细说明:
- 模型(Model):
- 职责:模型负责处理应用程序的数据逻辑。它直接与数据库或其他数据源进行交互,执行数据的创建、读取、更新和删除操作。
- 功能:模型通常包含应用程序的核心业务逻辑和数据验证规则。
- 视图(View):
- 职责:视图负责呈现数据给用户。它获取来自模型的数据,并将其格式化为HTML或其他前端技术以显示在网页上。
- 功能:视图只负责展示数据,不处理业务逻辑或数据操作。
- 控制器(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的功能
- 命令对象和表单绑定:
- 在Spring Web MVC中,任何对象都可以作为命令或表单绑定对象。开发人员无需实现特定的框架接口或基类。
- Spring的数据绑定非常灵活。例如,它将类型不匹配视为验证错误,而不是系统错误。因此,无需在表单对象中将业务对象的属性重复为简单的无类型字符串以处理无效提交,或正确转换字符串。相反,通常直接绑定到业务对象更为合适。
- 视图解析:
- 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的一些主要特性:
- 角色的明确分离:
- 各个角色(如控制器、验证器、命令对象、表单对象、模型对象、DispatcherServlet、处理器映射、视图解析器等)都可以由专门的对象来完成。这种分离有助于代码的组织和维护。
- 强大而简洁的配置:
- 框架和应用程序类可以作为JavaBeans进行配置。这种配置能力包括在不同上下文之间的轻松引用,例如从Web控制器到业务对象和验证器。
- 适应性、非侵入性和灵活性:
- 可以根据需要定义任何控制器方法签名,可能使用参数注解(如@RequestParam、@RequestHeader、@PathVariable等)来适应特定场景。
- 可重用的业务代码:
- 使用现有的业务对象作为命令或表单对象,而不是将它们镜像到特定框架的基类。这避免了代码重复。
- 可定制的绑定和验证:
- 类型不匹配被视为应用级别的验证错误,保留了有问题的值,支持本地化的日期和数字绑定等,而不是仅仅使用字符串形式的表单对象并手动解析和转换为业务对象。
- 可定制的处理器映射和视图解析:
- 处理器映射和视图解析策略范围从简单的基于URL的配置到复杂的、专门构建的解析策略。Spring比那些要求使用特定技术的Web MVC框架更灵活。
- 灵活的模型传输:
- 使用名称/值Map的模型传输支持与任何视图技术的轻松集成。
- 可定制的区域设置、时区和主题解析:
- 支持使用或不使用Spring标签库的JSP、支持JSTL、支持Velocity而无需额外的桥接等。
- 简单但强大的JSP标签库:
- Spring标签库提供了对数据绑定和主题等功能的支持。自定义标签允许在标记代码方面具有最大的灵活性。
- JSP表单标签库:
- Spring 2.0引入的JSP表单标签库使在JSP页面中编写表单变得更加容易。
- 基于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部分保持在网页底部
中间内容高度不够屏幕高度撑不开的页面时候,页面footer部分都能保持在网页页脚(最底部)的方法 1、首先上图看显示效果 2、奉上源码 2.1、html部分 <body><header>头部</header><main>主区域</main><foot…...
Java中创建线程的几种方式
底层都是基于实现Runnable接口 1.继承thread类,new一个thread对象,实现run方法,无返回值 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的概念、结构、架构,相信大家对Cache已经大概有了初步的了解。这里简单归纳一下: (1) Cache从硬件视角看,是连接PE-Core和主存的一种存储介质,存储的数据是主存中数据的副本…...

【笔试常见编程题06】最近公共祖先、求最大连续bit数、二进制插入、查找组成一个偶数最接近的两个素数
1. 最近公共祖先 将一棵无穷大满二叉树的结点按根结点一层一层地从左往右编号,根结点编号为1。现给定a,b为两个结点。设计一个算法,返回a、b最近的公共祖先的编号。注意其祖先也可能是结点本身。 测试样例: 2,3 返回&a…...

【工具分享】Gophish——网络钓鱼框架
文章目录 Gophish安装方式功能简介 Gophish Gophish 是一个开源的网络钓鱼框架,它被设计用于模拟真实世界的钓鱼攻击,以帮助企业和渗透测试人员测试和评估他们的网络钓鱼风险。Gophish 旨在使行业级的网络钓鱼培训对每个人都是可获取的,它易…...
“职业三大底层逻辑“是啥呢?
大家好,我是有用就扩散。 掌握职业发展的三大底层逻辑以宏观视角看待自己的职业发展道路具备长远规划自己职业路劲的能力通过成就事件呈现自己的工作成绩 一、痛点陈述 不喜欢眼前的工作?眼前的工作琐碎没前途?找不到能力提升的方向时候会…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...