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 /…...
git rebase和merge的区别
Git merge和Git rebase是两种不同的合并策略,它们在处理分支合并时有各自的优点和缺点。 Git fetch git fetch 命令用于从远程仓库获取最新的更改,但不会自动合并这些更改到你的本地分支。它会下载远程仓库的所有分支和标签,并更新你的本地…...
【elkb】linux麒麟v10安装ELKB 8.8.X版本(ARM架构)
下载软件 相关版本信息 elasticsearch:8.8.1kibana:8.8.1logstash:8.8.1filebeat:8.8.1 下载地址 https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.8.1-linux-aarch64.tar.gzhttps://artifacts.elastic…...
bluez hid host介绍,连接键盘/鼠标/手柄不是梦,安排
零. 前言 由于Bluez的介绍文档有限,以及对Linux 系统/驱动概念、D-Bus 通信和蓝牙协议都有要求,加上网络上其实没有一个完整的介绍Bluez系列的文档,所以不管是蓝牙初学者还是蓝牙从业人员,都有不小的难度,学习曲线也相对较陡,所以我有了这个想法,专门对Bluez做一个系统…...
GPT打数模——电商品类货量预测及品类分仓规划
背景 电商企业在各区域的商品存储主要由多个仓库组成的仓群承担。其中存储的商品主要按照属性(品类、件型等)进行划分和打标,便于进行库存管理。图 1 是一个简化的示意图,商品品类各异,件数众多,必须将这些…...
华为OD机试 - 螺旋数字矩阵 - 矩阵(Python/JS/C/C++ 2024 D卷 100分)
华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…...
分类预测 | GCN图卷积神经网络多特征分类预测(MATLAB)
分类预测 | GCN图卷积神经网络多特征分类预测(MATLAB) 目录 分类预测 | GCN图卷积神经网络多特征分类预测(MATLAB)分类效果基本介绍程序设计参考资料分类效果 基本介绍 GCN图卷积神经网络多特征分类预测(MATLAB) 在图卷积神经网络(GCN)中,多特征分类...
FPGA搭建PCIE3.0通信架构简单读写测试,基于XDMA中断模式,提供3套工程源码和技术支持
目录 1、前言工程概述免责声明 2、相关方案推荐我已有的PCIE方案本博客方案的PCIE2.0版本 3、PCIE基础知识4、工程详细设计方案工程设计原理框图XDMA配置及使用XDMA中断模块数据缓存架构用户逻辑Windows版本XDMA驱动安装Linux版本XDMA驱动安装测试应用程序工程源码架构PCIE上板…...
App相关技术以及打包
平时小伙伴们自己的博客网站只能在浏览器打开,但是有时候你想要制作自己独立个人博客app,宣传并推广自己的app,打造个人ip。如何把自己的web博客网站打包成安卓app? 1.开发App的相关技术使⽤ ⽬前市⾯上的移动互联开发技术主要分…...
【unity】【游戏开发】Unity代码不给提示怎么办?
【现象】 Unity用着用着忽然VS脚本不给提示了。 【分析】 重启Unity无效 重启VS无效 重装VS无效 感觉应该是项目设置问题 【最终方法】 打开Edit->Preferences。 如果是这个画面就把Script Editor改成自己的VS编辑器。 变成下面这个样子,点击Regenerate Pr…...
Kubernetes固定Pod IP和Mac地址
方案1: 在 Calico GitHub Issues#5196 问题的 commits#6249 提交中,引入新的 Pod 注释cni.projectcalico.org/hwAddr,用于将指定的 MAC 地址分配给容器端 Veth 接口。 将Calico升级至v3.24.1或以上版本,使用如下注解轻松设置Pod…...
网站建设一六八互联/东莞搜索优化
本文授权转载自学术头条作者:赵雅琦前段时间,浙江高考满分作文《生活在树上》因为晦涩难懂的内容,刷爆了各种社交媒体。外行人看热闹,内行人看门道,大神们透过现象看本质。一般来说,高考作文可以通过批量化…...
家乐福官网/荥阳seo推广
昨天晚上在寝室写python多线程的时候,用了几个测试的程序,分别是递归方法求斐波那契数的值。分别采用单线程一个一个执行的方法和采用多线程调用的方法。观察所用的时间基本上差不多的。 然后我在每个函数内部加入sleep()函数以后,分别让它们…...
做网站教程下载/十大销售管理软件排行榜
2019独角兽企业重金招聘Python工程师标准>>> 可以从下面地址下载tomcat插件 主页:http://www.eclipsetotale.com/tomcatPlugin.html 安装方法: 解压tomcatPluginv331.zip后将jar包复制到eclipse安装目录中的plugins目录中 重启eclipse&…...
powered by wordpress/云南今日头条新闻
项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于java的外卖点菜系统,管理员通过后台添加菜品,用户浏览器登录,查看菜品、购买、下单等。根据需求,本系统采用的是BS(Browser Server简称浏览器服…...
厦门网站搜索优化/如何制作网页
CoOS提供了一个事件标志的机制,用起来跟信号量差不多。 1、CoCreateFlag(),创建一个事件标志 OS_FlagID CoCreateFlag (BOOL bAutoReset,BOOL bInitialState); bAutoReset,为0表示手动复位,为1表示自动复位。 bInitialState,…...
建公司网站步骤/天津网络推广公司
往期精彩回顾前言 基于上一期的理论知识,我们本期跟大家分享一下如何通过Python和R语言完成Logistic回归分类器的构建。大家都知道,Logistic模型主要是用来解决二元分类问题,通过构建分类器,计算每一个样本为目标分类的概率&#…...