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

spring MVC 介绍

Spring MVC 是 Spring 框架中用于构建 Web 应用的核心模块,基于 MVC 设计模式(Model-View-Controller)实现。以下是其核心概念的整理:


1. MVC 设计模式

Model(模型):封装业务数据和业务逻辑(如 POJO 对象、Service 层)。
View(视图):负责数据展示(如 JSP、Thymeleaf、HTML)。
Controller(控制器):接收请求,调用业务逻辑,返回模型和视图。


2. 核心组件

(1) DispatcherServlet(前端控制器)

作用:Spring MVC 的入口,统一处理所有请求,协调各组件工作。
配置:在 web.xml 中定义,或通过 Spring Boot 自动配置。
流程

  1. 接收 HTTP 请求。
  2. 调用 HandlerMapping 找到对应的控制器(Controller)。
  3. 调用 HandlerAdapter 执行控制器逻辑。
  4. 处理结果通过 ViewResolver 解析为视图。
(2) HandlerMapping

作用:根据请求 URL 找到对应的 Controller 和方法。
默认实现RequestMappingHandlerMapping(基于 @RequestMapping 注解)。

(3) Controller

作用:处理具体业务逻辑,返回数据或视图。
核心注解
@Controller:标记为控制器。
@RestController:专用于 REST API(等价于 @Controller + @ResponseBody)。
@RequestMapping:定义请求映射路径(类或方法级别)。
@GetMapping@PostMapping 等:简化特定 HTTP 方法的映射。

(4) ViewResolver(视图解析器)

作用:将逻辑视图名(如 "home")解析为实际视图(如 home.jsp)。
常用实现
InternalResourceViewResolver:解析 JSP。
ThymeleafViewResolver:解析 Thymeleaf 模板。

(5) Model

作用:向视图传递数据的容器。
使用方式
• 通过 Model 对象(方法参数)添加数据。
• 使用 @ModelAttribute 绑定请求参数到对象。


3. 请求处理流程

  1. 用户发起请求 → DispatcherServlet 接收请求。
  2. 查询 HandlerMapping → 找到对应的 Controller 方法。
  3. 调用 HandlerAdapter → 执行控制器方法。
  4. 处理业务逻辑 → 返回 ModelAndView(或直接返回数据)。
  5. 解析视图 → ViewResolver 将逻辑视图名解析为实际视图。
  6. 渲染视图 → 结合 Model 数据生成 HTML/JSON 响应。

4. 关键注解

(1) 请求映射

@RequestMapping:定义 URL 路径和 HTTP 方法。

@RequestMapping(value = "/user", method = RequestMethod.GET)

@GetMapping@PostMapping 等:简化版映射注解。

(2) 参数绑定

@RequestParam:绑定请求参数到方法参数。

public String getUser(@RequestParam("id") Long id) { ... }

@PathVariable:绑定 URL 路径变量。

@GetMapping("/user/{id}")
public String getUser(@PathVariable Long id) { ... }

@RequestBody:将请求体(JSON/XML)绑定到对象。

@PostMapping("/user")
public User createUser(@RequestBody User user) { ... }
(3) 数据传递

Model:通过方法参数传递数据到视图。

@GetMapping("/users")
public String listUsers(Model model) {model.addAttribute("users", userService.findAll());return "user/list";
}

@ModelAttribute:绑定表单数据到对象。

@PostMapping("/user")
public String saveUser(@ModelAttribute User user) { ... }
(4) 数据验证

@Valid:触发 JSR-303 验证(需配合 hibernate-validator)。

@PostMapping("/user")
public String saveUser(@Valid @ModelAttribute User user, BindingResult result) {if (result.hasErrors()) { ... }
}

5. 视图技术

JSP:传统 Java 视图技术,需配置 ViewResolver
Thymeleaf:现代模板引擎,与 Spring Boot 集成简单。
JSON 响应:使用 @ResponseBody@RestController 返回 JSON 数据。


6. RESTful 支持

HTTP 方法语义化
GET 查询,POST 新增,PUT 更新,DELETE 删除。
状态码与响应
• 使用 ResponseEntity 控制状态码和响应头。

@GetMapping("/user/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {User user = userService.findById(id);return ResponseEntity.ok(user); // 200 OK
}

7. 高级特性

(1) 拦截器(Interceptor)

作用:在请求处理前后插入逻辑(如日志、权限校验)。
实现:实现 HandlerInterceptor 接口,配置到 InterceptorRegistry

(2) 异常处理

@ExceptionHandler:在 Controller 内处理特定异常。
@ControllerAdvice:全局异常处理(所有 Controller 共享)。

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public ResponseEntity<String> handleException(Exception e) {return ResponseEntity.status(500).body(e.getMessage());}
}
(3) 文件上传

• 使用 MultipartFile 接收上传文件。

@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) { ... }

8. 与其他技术集成

数据库:整合 Spring Data JPA、MyBatis。
安全:通过 Spring Security 实现权限控制。
测试:使用 MockMvc 模拟 HTTP 请求测试 Controller。


总结

Spring MVC 的核心是 DispatcherServlet 驱动的请求处理流程,通过注解简化配置,结合组件化设计实现灵活扩展。掌握以下关键点即可快速上手:

  1. 请求映射(@RequestMapping 系列注解)。
  2. 参数绑定与数据验证。
  3. 视图解析与数据传递。
  4. RESTful API 设计。
  5. 拦截器与全局异常处理。

结合 Spring Boot 可进一步简化配置,快速构建 Web 应用。建议通过实际项目(如用户管理系统)练习核心功能。

相关文章:

spring MVC 介绍

Spring MVC 是 Spring 框架中用于构建 Web 应用的核心模块&#xff0c;基于 MVC 设计模式&#xff08;Model-View-Controller&#xff09;实现。以下是其核心概念的整理&#xff1a; 1. MVC 设计模式 • Model&#xff08;模型&#xff09;&#xff1a;封装业务数据和业务逻辑…...

计算机的基本组合和工作原理

计算机的基本组成和工作原理可以概括为以下几个核心部分&#xff1a; 一、计算机的基本组成&#xff08;冯诺依曼体系结构&#xff09; 现代计算机基于冯诺依曼体系结构&#xff0c;主要由以下五大部件组成&#xff1a; 控制器&#xff08;Control Unit, CU&#xff09; 功能&…...

美国国家数据浮标中心(NDBC)

No.大剑师精品GIS教程推荐0地图渲染基础- 【WebGL 教程】 - 【Canvas 教程】 - 【SVG 教程】 1Openlayers 【入门教程】 - 【源代码示例 300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3MapboxGL【入门教程】 - 【源代码图文示例150】 4Cesium 【入门教程】…...

【计算机网络】网络简介

文章目录 1. 局域网与广域网1.1 局域网1.2 广域网 2. 路由器和交换机3. 五元组3.1 IP和端口3.2 协议3.3 协议分层 4. OSI七层网络协议5. TCP/IP五层模型5.1 TCP/IP模型介绍5.2 网络设备所在分层 6. 封装与分用6.1 数据包的称谓6.2 封装6.3 分用 1. 局域网与广域网 1.1 局域网 …...

Vue.js 模板语法全解析:从基础到实战应用

引言 在 Vue.js 的开发体系中&#xff0c;模板语法是构建用户界面的核心要素&#xff0c;它让开发者能够高效地将数据与 DOM 进行绑定&#xff0c;实现动态交互效果。通过对《Vue.js 快速入门实战》中关于 Vue 项目部署章节&#xff08;实际围绕 Vue 模板语法展开&#xff09;…...

python+ffmpeg给音频添加背景音乐

说明&#xff1a; 我希望用python&#xff0c;将name.mp3这段录音文件&#xff0c;添加背景音乐&#xff0c;bg.mp3&#xff0c;然后生成新的文件 step1: 添加依赖 pip install pydubstep2:下载ffmpeg 1.打开windows powershell &#xff0c;管理员运行 2.winget install ff…...

bootstrap 表格插件bootstrap table 的使用经验谈!

最近在开发一个物业管理软件&#xff0c;其中用到bootstrap 的模态框。同时需要获取表格数据。用传统的方法&#xff0c;本人不想用&#xff0c;考虑到bootstrap应该有获取表格数据的方法&#xff0c;结果发现要想实现获取表格数据功能&#xff0c;需要通过bootstrap的插件实现…...

Spring Boot框架识别

1. 通过icon图标进行识别 2、如果 web 应用开发者没有修改 SpringBoot Web 应用的默认 4xx、5xx 报错页面&#xff0c;那么当 web 应用程序出现 4xx、5xx 错误时&#xff0c;会报错如下图&#xff1a; 其他页面 工具一把梭哈...

【MySQL】【已解决】Windows安装MySQL8.0时的报错解决方案

一、引言 先说一些没用的话&#xff0c;据说安装MySQL是无数数据库初学者的噩梦&#xff0c;我在安装的时候也是查了很多资料&#xff0c;看了很多博客&#xff0c;但是很多毕竟每个人的电脑有各自不同的情况&#xff0c;大家的报错也不尽相同&#xff0c;所以也是很长时间之后…...

基于linux平台的C语言入门教程(7)类型转换

文章目录 1. 什么是类型转换&#xff1f;2. 隐式类型转换隐式类型转换的规则&#xff1a; 3. 显式类型转换显式类型转换的语法&#xff1a; 4. 示例代码代码解析&#xff1a;输出结果&#xff1a; 5. 常见问题问题 1&#xff1a;隐式类型转换会导致数据丢失吗&#xff1f;问题 …...

MES汽车零部件制造生产监控看板大屏

废话不多说&#xff0c;直接上效果 预览效果请在大的显示器查看&#xff0c;笔记本可能有点变形 MES汽车零部件制造生产监控看板大屏 纯html写的项目结构如下 主要代码分享 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UT…...

晶鑫股份迈向敏捷BI之路,永洪科技助力启程

数据驱动的时代&#xff0c;每一次技术的创新和突破都在为企业的发展注入新的动力。而敏捷性也不再是选择&#xff0c;是企业生存与发展的必要条件。作为连续5年获得中国敏捷BI第一名的永洪科技&#xff0c;通过不断地在数据技术领域深耕细作&#xff0c;再次迎来了行业内的关注…...

Browser Use Web UI 本地部署完全指南:从入门到精通

文章目录 引言一、项目概述1.1 核心功能1.2 技术特点 二、环境准备2.1 系统要求2.2 必要工具 三、详细部署步骤3.1 获取项目代码3.2 配置 Python 环境3.3 安装项目依赖3.4 环境配置3.5 启动应用 四、DeepSeek-V1 模型配置4.1 基础配置 五、执行Browser Use六、故障排查指南6.1 …...

Java单例模式、懒汉模式、饿汉模式和懒加载

好的&#xff01;我们来详细讲解单例模式、懒汉模式、饿汉模式和懒加载&#xff0c;争取让你看完就懂&#xff01; &#x1f7e6; 一、单例模式&#xff08;Singleton Pattern&#xff09; 定义&#xff1a;确保一个类只有一个实例&#xff0c;并提供一个全局访问点。 应用场…...

Linux 内核源码阅读——ipv4

Linux 内核源码阅读——ipv4 综述 在 Linux 内核中&#xff0c;IPv4 协议的实现主要分布在 net/ipv4/ 目录下。以下是一些关键的源文件及其作用&#xff1a; 1. 协议栈核心 net/ipv4/ip_input.c&#xff1a;处理接收到的 IPv4 数据包&#xff08;输入路径&#xff09;。net…...

nginx5天时间从0到熟练掌握学习计划

要在 5 天内熟练地在项目中使用 Nginx&#xff0c;需要制定一个高效的学习计划&#xff0c;重点学习 Nginx 的核心功能和实际应用。以下是一个详细的学习计划&#xff0c;帮助你从零开始掌握 Nginx。 学习目标 掌握 Nginx 的基本概念和安装方法。能够配置 Nginx 托管静态文件、…...

宝塔平替!轻量级开源 Linux 管理面板 mdserver-web

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 想必很多人刚接触 Linux 云服务器的时候都听过或者用过宝塔面板&#xff0c;对于小白来说&#xff0c;使用面板大大降低了服务器运维的难度&#xff0c;一键安装 LNMP 环境就可以建站了&#xff0c;像是 N…...

蓝桥杯 劲舞团

问题描述 小蓝最近迷上了一款名为 “劲舞团” 的游戏。 在游戏中&#xff0c;只要按照给出的键位提示依次按出对应的键位&#xff0c;游戏人物便可以跟随节奏跳舞。 对于连续的 K 次正确敲击&#xff0c;如果任意连续两次敲击之间的时间间隔都小于等于 1 秒&#xff08;即 1…...

基于springboot+vue的网络海鲜市场

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…...

QT开发(6)--信号和槽

这里写目录标题 1. 信号和槽概述信号的本质槽的本质 2. 信号和槽的使用2.1 连接信号和槽2.2 文档查询 3.自定义信号和槽3.1 自定义槽3.2 自定义信号3.3 带参数的信号和槽 4. 信号和槽的断开 1. 信号和槽概述 在Qt中&#xff0c;⽤⼾和控件的每次交互过程称为⼀个事件。⽐如&quo…...

Linux部署DHCP服务脚本

#!/bin/bash #部署DHCP服务 #userli 20250319#检查是否为root用户 if[ "$USER" ! "root" ] thenecho "错误&#xff1a;非root用户&#xff0c;权限不足&#xff01;"exit 0 fi#配置网络环境 read -ep "请给本机配置一个IP地址(不…...

Dervy数据库

Derby 和 Sqlite 数据库都是无需安装的数据库 Derby 和 Sqlite 数据库的配置与使用_derby sqlite-CSDN博客 Derby数据库简明教程_原味吐司-腾讯云---开发者社区 下载 对于jdk1.8及以上 Apache Derby 10.14.2.0 Release 进入bin 找到 启动服务端 进入bin目录 实际上是启…...

Pythonic编程设计风格解析

Python 作为一种“优雅”、“简洁”、“明确”的编程语言&#xff0c;自诞生以来便以其极强的可读性和简洁的语法风靡全球。然而&#xff0c;真正掌握 Python 并不仅仅是会写 Python 代码&#xff0c;更在于是否写出了Pythonic 风格的代码。什么是 Pythonic&#xff1f;Guido v…...

优化 SQL 语句方向和提升性能技巧

优化 SQL 语句是提升 MySQL 性能的关键步骤之一。通过优化 SQL 语句,可以减少查询时间、降低服务器负载、提高系统吞吐量。以下是优化 SQL 语句的方法、策略和技巧: 一、优化 SQL 语句的方法 1. 使用 EXPLAIN 分析查询 作用:查看 SQL 语句的执行计划,了解查询是如何执行的…...

Json的应用实例——cad 二次开发c#

以下是一个使用AutoCAD C#.NET API实现你需求的示例代码&#xff0c;代码实现了提示用户选择一个实体&#xff0c;将一些字符串变量及其对应的值组成JSON格式数据存储到实体的扩展数据&#xff08;XData&#xff09;中&#xff0c;并在弹出窗口中显示该实体的所有扩展数据信息。…...

[AI速读]CHISEL vs. SystemVerilog:用RISC-V核心对比两种硬件设计语言

在硬件设计领域,选择合适的语言对开发效率、维护成本和最终性能都至关重要。最近,一项研究对比了两种硬件描述语言——CHISEL(基于Scala的嵌入式语言)和传统的SystemVerilog,它们分别实现了同一款RISC-V核心(SweRV-EL2)。以下是关键发现和结论。 为什么选择CHISEL? CHI…...

颠覆者的困局:解构周鸿祎商业哲学中的“永恒战争”

引言&#xff1a;被误解的破坏者 在北京海淀区知春路银谷大厦的某间会议室里&#xff0c;周鸿祎用马克笔在白板上画出一个巨大的爆炸图案——这是2010年360与腾讯开战前夜的战术推演场景。这个充满硝烟味的瞬间&#xff0c;恰是《颠覆者》精神内核的完美隐喻&#xff1a;在中国…...

免费送源码:Java+springboot+MySQL 房屋租赁系统小程序的设计与实现 计算机毕业设计原创定制

目 录 摘要 1 1 绪论 1 1.1选题意义 1 1.2开发现状 1 1.3springboot框架介绍 1 1.4论文结构与章节安排 1 2 房屋租赁系统小程序系统分析 3 2.1 可行性分析 3 2.1.1 技术可行性分析 3 2.1.2 经济可行性分析 3 2.1.3 法律可行性分析 3 2.2 系统功能分析 3 2.2.1 功…...

【计算机网络原理】选择题+简答题

文章目录 选择题网络基础IP网络拓扑 OSI七层模型协议HDLCTCP/IP 交换技术网络安全数字签名 算法与策略 简答题UDPTCP 选择题 网络基础 下列域名中&#xff0c;属于国际顶级域名的是&#xff08;&#xff09; A. us B. tom C. edu D. int 下列关于光纤传输介质的叙述中错误的是…...

个人学习编程(3-22) leetcode刷题

连续子数组&#xff1a;&#xff08;难&#xff09; 示例 1: 输入: nums [0,1] 输出: 2 说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。 示例 2: 输入: nums [0,1,0] 输出: 2 说明: [0, 1] (或 [1, 0]) 是具有相同数量0和1的最长连续子数组。 需要理解的知识&a…...