Spring MVC 知识点全解析
Spring MVC 知识点全解析
Spring MVC 是一个基于 Java 的请求驱动的 Web 框架,属于 Spring 框架的一部分,广泛用于构建企业级 Web 应用程序。本文将详细阐述 Spring MVC 的核心知识点,包括其工作原理、关键组件、配置、请求处理、数据绑定、异常处理等。
1. Spring MVC 概述
1.1 什么是 Spring MVC
Spring MVC(Model-View-Controller)是一个基于 MVC 设计模式的框架,它将应用程序分为三部分:
- Model:表示应用程序的数据和业务逻辑。
- View:负责呈现数据的用户界面。
- Controller:处理用户的请求并返回模型和视图。
1.2 特点
- 灵活性:支持多种视图技术(如 JSP、Thymeleaf、FreeMarker 等)。
- 松耦合:通过接口和注解,组件间的耦合度较低。
- 强大的数据绑定:支持复杂对象的自动数据绑定和校验。
- 丰富的扩展性:可以通过拦截器、过滤器等方式扩展功能。
2. Spring MVC 的工作原理
Spring MVC 的工作流程可以总结为以下几个步骤:
- 请求到达 DispatcherServlet:所有请求首先到达 DispatcherServlet,它是 Spring MVC 的前端控制器,负责请求的分发。
- 处理请求:DispatcherServlet会将请求委托给相应的HandlerMapping,根据请求的 URL 找到对应的控制器。
- 调用控制器:DispatcherServlet调用对应的控制器方法,控制器处理请求并返回模型和视图。
- 返回视图:返回的视图名会被 ViewResolver解析为实际的视图对象。
- 渲染视图:视图被渲染并返回给用户。
3. 核心组件
3.1 DispatcherServlet
DispatcherServlet 是 Spring MVC 的核心组件,它负责请求的接收、分发和处理。
3.2 HandlerMapping
HandlerMapping 是用来将请求映射到相应的控制器的接口。Spring MVC 提供了多种实现方式,如 RequestMappingHandlerMapping。
3.3 Controller
控制器是处理用户请求的核心部分,负责处理业务逻辑并返回视图。可以使用 @Controller 注解来定义控制器。
3.4 ModelAndView
ModelAndView 是用于封装模型和视图的对象。控制器返回一个 ModelAndView 对象,包含模型数据和视图名。
3.5 ViewResolver
ViewResolver 负责将逻辑视图名解析为实际的视图实现。常用的实现有 InternalResourceViewResolver、ThymeleafViewResolver 等。
3.6 Interceptor
拦截器用于在请求处理之前和之后执行一些逻辑,如权限验证、日志记录等。可以通过实现 HandlerInterceptor 接口来定义。
4. Spring MVC 配置
4.1 XML 配置
在 web.xml 中配置 DispatcherServlet:
<servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup>
</servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>
在 dispatcher-servlet.xml 中配置视图解析器和组件扫描:
<context:component-scan base-package="com.example.controller"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/"/><property name="suffix" value=".jsp"/>
</bean>
4.2 注解配置
使用注解配置更加简洁,通常在主类中使用 @EnableWebMvc 开启 Spring MVC 支持,并通过 @ComponentScan 扫描控制器。
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.example.controller")
public class WebConfig {@Beanpublic InternalResourceViewResolver viewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/views/");resolver.setSuffix(".jsp");return resolver;}
}
5. 请求处理
5.1 控制器方法
控制器方法通过 @RequestMapping 注解映射请求,可以指定请求方法、路径等:
@Controller
@RequestMapping("/user")
public class UserController {@GetMapping("/{id}")public String getUser(@PathVariable("id") Long id, Model model) {User user = userService.findById(id);model.addAttribute("user", user);return "userDetail";}@PostMappingpublic String createUser(@ModelAttribute User user) {userService.save(user);return "redirect:/user/list";}
}
5.2 路径变量和请求参数
使用 @PathVariable 和 @RequestParam 获取路径变量和请求参数:
@GetMapping("/search")
public String search(@RequestParam("query") String query, Model model) {List<User> users = userService.search(query);model.addAttribute("users", users);return "userList";
}
5.3 数据绑定和校验
Spring MVC 提供了自动数据绑定的功能,可以通过 @ModelAttribute 和 JSR-303 注解实现数据校验:
@PostMapping
public String createUser(@Valid @ModelAttribute User user, BindingResult result) {if (result.hasErrors()) {return "userForm";}userService.save(user);return "redirect:/user/list";
}
6. 视图解析
6.1 JSP 视图
使用 JSP 作为视图技术时,可以通过 JSP 文件来渲染模型数据。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head><title>User List</title>
</head>
<body>
<h1>User List</h1>
<table><tr><th>ID</th><th>Name</th></tr><c:forEach var="user" items="${users}"><tr><td>${user.id}</td><td>${user.name}</td></tr></c:forEach>
</table>
</body>
</html>
6.2 Thymeleaf 视图
Thymeleaf 是一个现代的服务器端 Java 模板引擎,支持 HTML5 和模板语法。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><title>User List</title>
</head>
<body>
<h1>User List</h1>
<table><tr><th>ID</th><th>Name</th></tr><tr th:each="user : ${users}"><td th:text="${user.id}"></td><td th:text="${user.name}"></td></tr>
</table>
</body>
</html>
7. 异常处理
7.1 全局异常处理
使用 @ControllerAdvice 定义全局异常处理,处理所有控制器的异常:
@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(UserNotFoundException.class)public ModelAndView handleUserNotFound(UserNotFoundException ex) {ModelAndView modelAndView = new ModelAndView("error");modelAndView.addObject("message", ex.getMessage());return modelAndView;}
}
7.2 自定义异常
可以自定义异常类,并在控制器中抛出以便统一处理。
public class UserNotFoundException extends RuntimeException {public UserNotFoundException(String message) {super(message);}
}
8. 拦截器
8.1 定义拦截器
拦截器实现 HandlerInterceptor 接口,可以在请求处理前、后执行逻辑。
public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {// 处理前逻辑return true; // 继续请求处理}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {// 处理后逻辑}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {// 完成后逻辑}
}
8.2 注册拦截器
拦截器需要在配置类中注册。你可以通过实现 WebMvcConfigurer 接口来注册自定义的拦截器:
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**") // 拦截所有请求.excludePathPatterns("/login"); // 排除登录请求}
}
9. RESTful 风格的 API
Spring MVC 也非常适合构建 RESTful 风格的 API。可以使用 @RestController 注解简化返回 JSON 数据的操作。
9.1 REST 控制器示例
@RestController
@RequestMapping("/api/users")
public class UserRestController {@GetMapping("/{id}")public ResponseEntity<User> getUser(@PathVariable Long id) {User user = userService.findById(id);return user != null ? ResponseEntity.ok(user) : ResponseEntity.notFound().build();}@PostMappingpublic ResponseEntity<User> createUser(@RequestBody User user) {User createdUser = userService.save(user);return ResponseEntity.status(HttpStatus.CREATED).body(createdUser);}
}
10. 数据验证
Spring MVC 支持 JSR-303 规范的注解来进行数据验证。可以在模型类中使用注解定义验证规则。
10.1 模型类示例
import javax.validation.constraints.NotBlank;public class User {private Long id;@NotBlank(message = "Name is required")private String name;// getters and setters
}
10.2 控制器中的验证
在控制器中,结合 @Valid 注解进行数据验证:
@PostMapping
public String createUser(@Valid @ModelAttribute User user, BindingResult result) {if (result.hasErrors()) {return "userForm"; // 返回到表单视图}userService.save(user);return "redirect:/user/list";
}
11. 文件上传
Spring MVC 提供了文件上传的支持,可以通过 @RequestParam 轻松处理文件上传。
11.1 文件上传控制器
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.multipart.MultipartFile;@Controller
@RequestMapping("/upload")
public class FileUploadController {@PostMappingpublic String uploadFile(@RequestParam("file") MultipartFile file) {if (!file.isEmpty()) {// 处理文件保存逻辑}return "redirect:/upload/success";}
}
11.2 视图示例
在 JSP 或 Thymeleaf 视图中使用表单上传文件:
<form action="/upload" method="post" enctype="multipart/form-data"><input type="file" name="file" /><button type="submit">Upload</button>
</form>
12. 总结
Spring MVC 是一个强大且灵活的框架,适用于构建各种类型的 Web 应用程序。通过 MVC 设计模式的实现,Spring MVC 提供了良好的结构化方式来分离业务逻辑和表现层。
本文概述了 Spring MVC 的核心知识点,包括工作原理、关键组件、请求处理、数据绑定、异常处理、文件上传等。掌握这些知识点将有助于你在实际开发中高效地使用 Spring MVC。希望本文能够帮助你深入理解和应用 Spring MVC 框架。
相关文章:
Spring MVC 知识点全解析
Spring MVC 知识点全解析 Spring MVC 是一个基于 Java 的请求驱动的 Web 框架,属于 Spring 框架的一部分,广泛用于构建企业级 Web 应用程序。本文将详细阐述 Spring MVC 的核心知识点,包括其工作原理、关键组件、配置、请求处理、数据绑定、…...
 
python 基于FastAPI实现一个简易的在线用户统计 服务
简易在线用户统计服务 概述 这是一个基于Python的FastAPI框架实现的服务,用于统计客户端的心跳信息,并据此维护在线用户列表以及记录活跃用户数。 功能特性 心跳接收:接受来自客户端的心跳包,以更新客户端的状态。在线用户统计…...
glibc中xdr的一个bug
本人在64位linux服务器上(centos7),发现xdr_u_long这个函数有个bug,就是数字的范围如果超过unsigned int的最大值(4294967295)时,xdr_u_long失败。 这个场景主要用在unix时间戳上面,比如一款软件,设置有效期为100年。…...
 
Android Framework定制sim卡插入解锁pin码的界面
文章目录 手机设置SIM卡pin码一、安卓手机二、苹果手机 Android Framework中SIM卡pin码代码定位pin码提示文本位置定位pin码java代码位置 定制pin码framework窗口数字按钮 手机设置SIM卡pin码 设置 SIM 卡 PIN 码可以提高手机的安全性,防止他人在未经授权的情况下使…...
 
cc2530 Basic RF 讲解 和点灯讲解(1_1)
1. Basic RF 概述 Basic RF 是 TI 提供的一套简化版的无线通信协议栈,旨在帮助开发者快速搭建无线通信系统。它基于 IEEE 802.15.4 标准的数据包收发,但只用于演示无线设备数据传输的基本方法,不包含完整功能的协议。Basic RF 的功能限制包括…...
Android H5页面性能分析策略
文章目录 引言一、拦截资源加载请求以优化性能二、通过JavaScript代码监控资源下载速度三、使用vConsole进行前端性能调试四、使用Chrome DevTools调试Android端五、通过抓包分析优化网络性能六、总结 引言 在移动应用开发中,H5页面的性能直接影响到用户体验。本文…...
【前端面试】Typescript
Typescript面试题目回答 Typescript有哪些常用类型? Typescript的常用类型包括: 基本类型:boolean(布尔类型)、number(数字类型)、string(字符串类型)。特殊类型:nul…...
程序语言的内存管理:垃圾回收GC(Java)、手动管理(C语言)与所有权机制(Rust)(手动内存管理、手动管理内存)
文章目录 程序语言的内存管理:垃圾回收、手动管理与所有权机制引言一、垃圾回收机制(GC)(Java)1. 什么是垃圾回收机制2. 垃圾回收的工作原理3. 优点与缺点4. 示例代码 二、手动管理内存的分配和释放(C语言&…...
 
研究生论文学习记录
文献检索 检索论文的网站 知网:找论文,寻找创新点paperswithcode :这个网站可以直接找到源代码 直接再谷歌学术搜索 格式:”期刊名称“ 关键词 在谷歌学术搜索特定期刊的关键词相关论文,可以使用以下几种方法&#…...
 
毕业设计选题:基于Django+Vue的图书馆管理系统
开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 系统首页 图书馆界面 图书信息界面 个人中心界面 后台登录界面 管理员功能界面 用户…...
#网络安全#NGSOC与传统SOC的区别
NGSOC是Next Generation Security Operation Center(下一代安全运营中心)的缩写。 NGSOC安全运营服务基于态势感知与安全运营平台来开展监测分析等一系列的服务工作,旨在通过专业、高效的运营服务工作,帮助用户尽可能发挥NGSOC作…...
 
GCN+BiLSTM多特征输入时间序列预测(Pytorch)
目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 GCNBiLSTM多特征输入时间序列预测(Pytorch) 可以做风电预测,光伏预测,寿命预测,浓度预测等。 Python代码,基于Pytorch编写 1.多特征输入单步预测…...
 
LinkedList和链表之刷题课(下)
1. 给定x根据x把链表分割,大的结点放在x后面,小的结点放在x前面 题目解析: 注意此时的pHead就是head(头节点的意思) 基本上就是给定一个链表,我们根据x的值来把这个链表分成俩部分,大的那部分放在x后面,小的那部分放在x前面,并且我们不能改变链表本来的顺序,比如下面的链表,我…...
 
ollama 在 Linux 环境的安装
ollama 在 Linux 环境的安装 介绍 他的存在在我看来跟 docker 的很是相似,他把市面上已经存在的大语言模型集合在一个仓库中,然后通过 ollama 的方式来管理这些大语言模型 下载 # 可以直接通过 http 的方式吧对应的 shell 脚本下载下来,然…...
C语言二刷指针篇
&取得变量的地址 printf("%p\n", &a); printf("%p\n", a); printf("%p\n", &a[0]); printf("%p\n", &a[1]); 前三个输出相同,a[0]和a[1]之间相差4 指针就是保存地址的变量,指针里放的是别的…...
LeetCode题练习与总结:回文对--336
一、题目描述 给定一个由唯一字符串构成的 0 索引 数组 words 。 回文对 是一对整数 (i, j) ,满足以下条件: 0 < i, j < words.length,i ! j ,并且words[i] words[j](两个字符串的连接)是一个回文…...
CesiumJS 案例 P7:添加指定长宽的图片图层(原点分别为图片图层的中心点、左上角顶点、右上角顶点、左下角顶点、右下角顶点)
CesiumJS CesiumJS API:https://cesium.com/learn/cesiumjs/ref-doc/index.html CesiumJS 是一个开源的 JavaScript 库,它用于在网页中创建和控制 3D 地球仪(地图) 一、添加指定长宽的图片图层(原点为图片图层的中心…...
Redis 主从同步 问题
前言 相关系列 《Redis & 目录》(持续更新)《Redis & 主从同步 & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Redis & 主从同步 & 总结》(学习总结/最新最准/持续更新)《Redis &a…...
【SQL Server】探讨 IN 和 EXISTS之间的区别
前言 在使用 SQL 查询相关表数据时,通常需要根据另一个表中的值来筛选数据。而 IN 与 EXISTS 子句都是用于此场景的常用方式,但使用时两者存在工作方式不同。它们使用上的选择会显著影响查询的性能,尤其是在大型数据集中。本文我们一起探讨 IN 和 EXISTS 之间的区别、使用与…...
清理pip和conda缓存
当用户目录没有空间时,可清理pip和conda缓存 清理conda缓存: conda clean --all清理pip缓存: pip cache purgeNote: 可以利用软链接,将用户目录下的文件链接到其他位置 首先移动文件或文件夹到其他位置 mv ~/test /…...
 
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
 
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
 
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
 
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
 
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
