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

Spring MVC 的核心知识点梳理

MVC 是什么MVC不是 Spring 发明的而是一种设计模式目的是“解耦”。MModel模型数据 业务逻辑。比如Teacher类TeacherService。VView视图展示数据的界面。比如 JSP、Thymeleaf 模板或者是现代返回 JSON 的前端页面。CController控制器接收用户请求调用 Model最后选择 View 来展示。流程用户点击一个链接 → Controller 拿到请求 → 调 Service 拿到数据Model→ 把数据交给 View 渲染 → 返回 HTML 给浏览器。Spring MVC 就是把这个流程在 Java Web 环境里落地的一套框架。核心组件与处理流程Spring MVC 最核心的就是一个前端控制器Front Controller——DispatcherServlet。组件作用常见实现DispatcherServlet统一入口调度一切Spring 提供我们只需配置HandlerMapping根据请求 URL 找到对应的处理器RequestMappingHandlerMappingHandlerAdapter执行找到的处理器Controller 方法RequestMappingHandlerAdapterHandlerInterceptor拦截器在处理方法前后做增强自定义ViewResolver根据视图名找到真正的视图文件InternalResourceViewResolver(JSP)HandlerExceptionResolver处理异常ExceptionHandlerExceptionResolver一个请求的完整生命周期回顾前面讲过的流程图请求到达DispatcherServlet。DispatcherServlet找HandlerMapping谁处理这个 URLHandlerMapping返回一个HandlerExecutionChain包含 Controller 方法 一堆拦截器。DispatcherServlet找HandlerAdapter谁能执行这个 Controller 方法HandlerAdapter执行具体方法期间会做参数绑定、类型转换、校验等。方法返回ModelAndView或ResponseBody直接返回数据。若有视图名ViewResolver解析出真正的 JSP 等视图。渲染视图响应给浏览器。Controller 与注解从入门到精通Controller RestControllerController// 声明这是一个控制器类方法通常返回视图名publicclassTeacherController{...}RestController// Controller ResponseBody所有方法默认返回 JSONpublicclassTeacherRestController{...}RequestMapping 及衍生注解RequestMapping(/teacher)// 类级别映射publicclassTeacherController{RequestMapping(value/list,methodRequestMethod.GET)publicStringlist(){...}// 等价于 GetMapping(/list)}GetMapping、PostMapping、PutMapping、DeleteMapping等都是RequestMapping的快捷方式。参数绑定注解重点对比注解从哪里拿数据示例RequestParamURL 问号后的参数或表单数据?nameTom→RequestParam(name) String namePathVariableURI 路径中的占位符/teacher/{id}→PathVariable(id) Long idRequestBody请求体中的 JSON/XMLPOST 的 JSON{name:Tom}自动转成 Teacher 对象ModelAttribute① 从 Model 中取② 把参数绑定到对象常用于表单提交自动封装对象RequestHeader请求头RequestHeader(User-Agent) String uaCookieValueCookieCookieValue(JSESSIONID) String sid把参数自动封装成对象Spring 可以直接将表单字段或 JSON 映射成一个 Java Bean。表单提交示例form action/teacher/save methodpost input namename/ !-- Teacher.name -- input nameage/ !-- Teacher.age -- input typesubmit/ /formPostMapping(/teacher/save)publicStringsave(ModelAttributeTeacherteacher){// teacher 对象已被自动填充 name 和 ageteacherService.save(teacher);returnredirect:/teacher/list;}底层原理DataBinderBeanWrapper负责属性拷贝。自定义类型转换器String → Date很多时候请求参数是String但你想转成Date、LocalDate或自定义类型。Spring 内置的转换器和格式化器ConverterS, T源类型 → 目标类型如StringToDateConverter。Formatter专为字符串和对象互转设计支持国际化适合String - Date。自定义一个 String → Date 的 Converter 示例ComponentpublicclassStringToDateConverterimplementsConverterString,Date{privatefinalSimpleDateFormatformatnewSimpleDateFormat(yyyy-MM-dd);OverridepublicDateconvert(Stringsource){try{returnformat.parse(source);}catch(ParseExceptione){thrownewIllegalArgumentException(日期格式必须为 yyyy-MM-dd);}}}在 Spring Boot 中只需让它被容器管理Component就会自动注册到转换器链。在传统 Spring MVC XML 中需要配置FormattingConversionServiceFactoryBean。使用场景GetMapping(/teacher/search)publicStringsearchByDate(RequestParam(date)Datedate){// /teacher/search?date2025-01-01 → date 直接转换好}如果转换失败会抛出TypeMismatchException我们可以用异常处理来统一返回友好信息。拦截器Interceptor和过滤器Filter两者都可以在请求前后做手脚但层级不同。对比维度Filter过滤器Interceptor拦截器归属Servlet 规范Java EESpring MVC 框架作用范围能拦截所有进入 Servlet 的请求包括静态资源只能拦截进到 Spring MVC 的请求DispatcherServlet 处理是否能用 Spring Bean不能直接注入可以迂回可以正常注入其他 Bean执行顺序先经过 Filter再进 DispatcherServlet在 DispatcherServlet 之后Controller 方法之前典型场景字符编码、跨域、权限安全检查登录检查、日志记录、性能监控、用户权限补充定义拦截器示例ComponentpublicclassLoginInterceptorimplementsHandlerInterceptor{OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler){// 检查 session 中是否有用户if(request.getSession().getAttribute(user)null){response.sendRedirect(/login);returnfalse;// 不放行}returntrue;}}注册拦截器ConfigurationpublicclassWebConfigimplementsWebMvcConfigurer{AutowiredprivateLoginInterceptorloginInterceptor;OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){registry.addInterceptor(loginInterceptor).addPathPatterns(/teacher/**)// 要拦截的.excludePathPatterns(/teacher/login);// 排除的}}异常处理优雅地给前端报错还记得我们之前聊过的“异常和错误”吗常用的处理方式是局部异常处理ControllerpublicclassTeacherController{ExceptionHandler(TeacherNotFoundException.class)publicStringhandleNotFound(TeacherNotFoundExceptionex,Modelmodel){model.addAttribute(msg,ex.getMessage());returnerror/404;// 返回错误视图}}全局异常处理推荐ControllerAdvicepublicclassGlobalExceptionHandler{ExceptionHandler(MethodArgumentNotValidException.class)ResponseStatus(HttpStatus.BAD_REQUEST)ResponseBodypublicMapString,StringhandleValidation(MethodArgumentNotValidExceptionex){// 返回校验失败信息如 {name:不能为空}...}ExceptionHandler(Exception.class)ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)ResponseBodypublicMapString,StringhandleGeneral(Exceptionex){returnMap.of(error,服务器内部错误);}}

相关文章:

Spring MVC 的核心知识点梳理

MVC 是什么 MVC 不是 Spring 发明的,而是一种设计模式,目的是“解耦”。 M(Model,模型):数据 业务逻辑。比如 Teacher 类,TeacherService。V(View,视图)&…...

IP第一次作业

...

HCIA前三章综合实验报告

实验要求按照图示配置IP地址完成路由器之间的协议配置构建需求的环境,配置MGRE,GRE测试全网通实验配置(1)配置IP地址[R1-GigabitEthernet0/0/0]ip address 192.168.1.2 24[R1-Serial4/0/0]ip address 15.1.1.1 24[R2-GigabitEther…...

如何让Windows任务栏变透明:TranslucentTB终极美化指南

如何让Windows任务栏变透明:TranslucentTB终极美化指南 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 想让你的Windows桌面焕…...

微信网页版终极解决方案:三步实现浏览器端微信完整使用指南

微信网页版终极解决方案:三步实现浏览器端微信完整使用指南 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web 还在为繁琐的微信安装流程而烦…...

Android虚拟定位终极指南:无需Root的应用级位置伪装解决方案

Android虚拟定位终极指南:无需Root的应用级位置伪装解决方案 【免费下载链接】FakeLocation Xposed module to mock locations per app. 项目地址: https://gitcode.com/gh_mirrors/fak/FakeLocation 你是否遇到过这样的困扰:想在游戏中签到获取限…...

GetQzonehistory:三步轻松备份QQ空间历史说说,永久保存青春记忆

GetQzonehistory:三步轻松备份QQ空间历史说说,永久保存青春记忆 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否担心QQ空间里的青春记忆会随着时间流逝而消…...

SpringBoot项目里用Sharding-JDBC做分库分表,这5个配置项最容易踩坑

SpringBoot整合Sharding-JDBC分库分表:五大高频配置陷阱与实战解决方案 当数据库单表数据量突破千万级大关时,分库分表几乎是每个Java开发者必须面对的课题。作为Apache ShardingSphere的核心模块,Sharding-JDBC以其轻量级、低侵入的特性成为…...

FGA自动化助手:告别FGO重复刷本,每天节省3小时游戏时间

FGA自动化助手:告别FGO重复刷本,每天节省3小时游戏时间 【免费下载链接】FGA Auto-battle app for F/GO Android 项目地址: https://gitcode.com/gh_mirrors/fg/FGA 你是否厌倦了在《命运/冠位指定》(FGO)中重复点击刷素材…...

Hotkey Detective:Windows热键冲突终极解决方案与实战指南

Hotkey Detective:Windows热键冲突终极解决方案与实战指南 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 你是…...

企业级AI低代码平台kweaver-dip:架构解析与工作流实战

1. 项目概述:一个面向企业级AI应用开发的低代码平台 最近在和一些做企业数字化转型的朋友聊天,大家普遍提到一个痛点:AI能力很强,但想把它真正用起来,门槛实在太高了。不是每个团队都有能力养一支算法工程师队伍&#…...

从蛋白质分类到社交网络:Graph Pooling在实际项目里到底怎么用?

从蛋白质分类到社交网络:Graph Pooling实战选型指南 在生物信息实验室里,研究员小李正盯着屏幕上错综复杂的蛋白质相互作用网络发愁——如何将这个包含数千个原子的三维结构转化为机器学习模型可处理的表征?与此同时,某社交平台算…...

基于WebAssembly的高效SQLite数据库在线解析方案

基于WebAssembly的高效SQLite数据库在线解析方案 【免费下载链接】sqlite-viewer View SQLite file online 项目地址: https://gitcode.com/gh_mirrors/sq/sqlite-viewer SQLite Viewer是一款采用纯前端技术的SQLite数据库在线查看工具,通过WebAssembly技术实…...

GOCI数据爬虫失效了?别慌!手把手教你用Python搞定新版韩国官网批量下载(附完整代码)

GOCI数据爬虫失效了?别慌!手把手教你用Python搞定新版韩国官网批量下载 最近不少同行反馈,之前运行的GOCI数据爬虫脚本突然失效了。作为长期处理海洋遥感数据的老手,我第一时间测试了韩国官网的新版页面结构,发现他们确…...

【冷链配送】遗传算法求解低碳冷链物流车辆路径问题(目标函数固定成本 运输成本 制冷成本 惩罚成本 总碳排放成本)【含Matlab源码 15428期】

💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab领域博客之家💞&…...

智算解构像素 实景生长孪生:摒弃人工建模冗余流程,开辟视频孪生快速规模化落地路径

智算解构像素 实景生长孪生副标题:摒弃人工建模冗余流程,开辟视频孪生快速规模化落地路径前言传统数字孪生落地始终深陷人工建模周期长、成本高、流程冗余、更新滞后的固化瓶颈。依赖外业测绘、人工描模、素材拼接、后期修模,环节繁琐、交付周…...

环境配置与基础教程:保姆级教程:VS Code DevContainer 一键构建可复现的 YOLO 训练开发容器

摘要 你是否还在为YOLO训练环境的搭建而焦头烂额?CUDA版本不匹配、Python依赖冲突、团队协作时“在我机器上能跑”的经典难题——这些问题浪费了无数开发者的宝贵时间。本文将带你通过VS Code DevContainer技术,一键构建完全可复现的YOLO训练开发容器,彻底告别环境配置噩梦…...

LaTeX2Word-Equation:三步实现网页公式到Word的精准转换

LaTeX2Word-Equation:三步实现网页公式到Word的精准转换 【免费下载链接】LaTeX2Word-Equation Copy LaTeX Equations as Word Equations, a Chrome Extension 项目地址: https://gitcode.com/gh_mirrors/la/LaTeX2Word-Equation 在学术写作和文档编辑过程中…...

2026英文论文降AI实战SOP:保留原格式,4招把AIGC率从97%压到8%

大家最近都在为英文降aigc率发愁吧,作为研三党,我太懂这种痛了,之前我自己写英文初稿,写完直接拿去查重,结果turnitin检测ai率飙到了89%,当时看着报告整个人都懵了。 怎么给英文降ai?对于非母语…...

Pandas数据合并:concat vs append,选哪个?用真实‘幸福指数’数据集测给你看

Pandas数据合并实战:concat与append深度性能对比 在数据分析工作中,数据合并是最基础也最频繁的操作之一。Pandas提供了多种合并数据的方法,其中concat和append是最常用的两种纵向合并方式。但很多开发者并不清楚它们在实际项目中的性能差异和…...

一本通题解——从递推公式到状态转移:破解“位数问题”中的数字计数

1. 从具体问题到通用模型:理解数字计数的本质 遇到"统计N位数中偶数个3的个数"这类问题时,很多初学者会陷入暴力枚举的思维陷阱。我刚开始刷题时也犯过这个错误——试图手动列出所有两位数来验证样例。这种方法的局限性在N1000时就会暴露无遗…...

终极指南:5分钟让Figma界面全面中文化,设计师效率翻倍!

终极指南:5分钟让Figma界面全面中文化,设计师效率翻倍! 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma的英文界面而烦恼吗?每…...

基础设施即代码最佳实践:自动化云原生基础设施管理

基础设施即代码最佳实践:自动化云原生基础设施管理 一、基础设施即代码概述 1.1 基础设施即代码的定义 基础设施即代码(Infrastructure as Code, IaC)是一种将基础设施配置和管理通过代码来实现的方法。它允许开发者使用版本控制、自动化测试…...

重新定义下载体验:ctfileGet城通网盘高速下载完整指南

重新定义下载体验:ctfileGet城通网盘高速下载完整指南 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 你是否曾经面对城通网盘几十KB/s的下载速度感到绝望?当急需一个大文件时&a…...

为LLM智能体构建主动防御:Agent Shield架构解析与实战部署

1. 项目概述:Agent Shield 是什么,以及它为何重要 最近在开源社区里,一个名为 agent-shield 的项目引起了我的注意。这个由 Shahar Dagan 发起的项目,直译过来是“智能体护盾”,其核心目标非常明确:为基于…...

基于Electron构建macOS效率工具:插件化命令执行与安全实践

1. 项目概述:一个为macOS开发者量身打造的效率工具 最近在GitHub上看到一个挺有意思的项目,叫 zhaobomin/copaw-macapp 。乍一看名字, copaw 这个组合词有点意思,结合 macapp 的后缀,不难猜出这是一个专门为macO…...

加法器优化:从并行前缀到AXON框架的技术演进

1. 加法器优化:从经典架构到AXON框架的演进在数字电路设计中,加法器作为最基础的算术运算单元,其性能直接影响整个系统的时钟频率和能效表现。传统加法器设计面临一个核心矛盾:如何在延迟(Delay)、功耗&…...

Node.js异步数据库操作:nedb-promises封装原理与实战指南

1. 项目概述:告别回调地狱,拥抱异步数据库操作 如果你在Node.js项目中用过NeDB,大概率对它的回调函数(callback)模式又爱又恨。NeDB本身是一个轻量级的嵌入式数据库,API设计简单直观,但在现代异…...

基于微信小程序的校园水果配送商城毕设源码

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在构建一个基于微信小程序的校园水果配送商城系统以解决传统校园水果采购与配送模式中存在的效率低下问题。当前高校后勤管理普遍面临供应链管理复杂、信…...

嵌入式音频处理框架arduino-audio-tools:从I2S流到网络电台的实战指南

1. 项目概述:一个为嵌入式音频处理而生的瑞士军刀 如果你在玩ESP32、ESP8266或者任何一块Arduino兼容的开发板,并且想在上面搞点音频相关的项目——比如做个网络电台、一个语音助手,或者一个简单的音频效果器——那你大概率绕不开音频数据的采…...