【笔记】Spring MVC 相关介绍
目录1.介绍一下org.springframework.ui.Model1. 本质与实现原理2. 示例代码2.被RequestMapping标注的类的方法参数3.BindingResult / Errors 必须紧跟在被校验的实体参数后面(代码说明)正确代码错误代码1.介绍一下org.springframework.ui.Modelorg.springframework.ui.Model是 Spring MVC 框架中极其核心的接口它的主要作用是在控制器Controller和视图View之间建立数据传递的桥梁。简单来说当你在后端处理完业务逻辑后需要将数据如用户信息、列表送到前端页面如 JSP、Thymeleaf显示Model就是那个用来装数据的“容器”。1. 本质与实现原理本质它是一个增强版的MapString, Object。你可以向其中添加 Key-Value 键值对。实际实现类在 Spring MVC 运行时我们直接使用的Model接口对象的实际实现类通常是BindingAwareModelMap它继承自ModelMap而ModelMap又继承自LinkedHashMap。存储位置当你调用model.addAttribute()时数据最终会被放入HttpServletRequest的attributes属性域中。因此它的作用域是Request 级别一次请求有效。2. 示例代码package com.example.controller; // 假设包名根据实际情况修改 import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; // 自定义的业务类和实体类根据项目实际包路径导入 import com.example.service.UserService; import com.example.entity.User; Controller RequestMapping(/api/user) // 类级别定义基础路径 public class UserController { // 模拟业务服务 private UserService userService new UserService(); // 方式一method RequestMethod.GET —— 查询用户详情 RequestMapping(value /profile, method RequestMethod.GET) public String getUserProfile(RequestParam(id) Long id, Model model) { // 1. 业务数据 User user userService.findById(id); String pageTitle 用户个人中心; // 2. 显式将数据放入 Model推荐视图名清晰 model.addAttribute(userInfo, user); model.addAttribute(title, pageTitle); // 3. 返回视图逻辑名由视图解析器解析如 Thymeleaf 或 JSP return profile; // 对应 /WEB-INF/views/profile.jsp 或 profile.html } // 方式二method RequestMethod.POST —— 新增用户重定向 RequestMapping(value /add, method RequestMethod.POST) public String addUser(ModelAttribute User user, Model model) { // 模拟保存 userService.save(user); // 给 Model 添加提示信息仅在当前请求有效 model.addAttribute(message, 添加成功); // 重定向时Model 中的数据不会带过去需要用 RedirectAttributes return redirect:/api/user/profile?id user.getId(); } }2.被RequestMapping标注的类的方法参数分类参数类型 / 注解作用说明示例代码请求数据提取PathVariable获取 URL 路径中的占位符变量PathVariable Long idRequestParam获取请求参数URL 查询参数或表单参数RequestParam String nameRequestParamrequiredfalse获取非必填参数未传时为 nullRequestParam(requiredfalse) Integer ageRequestParamdefaultValue获取参数未传时使用默认值RequestParam(defaultValue1) int pageRequestBody将请求体JSON/XML绑定到 Java 对象RequestBody User userRequestHeader获取 HTTP 请求头中的值RequestHeader(User-Agent) String uaCookieValue获取 Cookie 中的值CookieValue(JSESSIONID) String jidModelAttribute将请求参数绑定到对象并自动放入 ModelModelAttribute User userMatrixVariable获取矩阵变量/cars;colorredMatrixVariable String color数据输出Model添加键值对数据到 Request 作用域model.addAttribute(key, value)ModelMapModel的实现类用法类似 MapmodelMap.put(key, value)RedirectAttributes重定向时传递数据Flash AttributesredirectAttributes.addFlashAttribute(msg, 成功)验证与错误BindingResult接收Valid校验的结果错误信息Valid RequestBody User user, BindingResult resultErrorsBindingResult的父接口功能相同Errors errorsServlet APIHttpServletRequest获取原生请求对象HttpServletRequest requestHttpServletResponse获取原生响应对象HttpServletResponse responseHttpSession获取当前会话自动创建HttpSession sessionWebRequestSpring 封装的通用请求接口WebRequest webRequestNativeWebRequest更底层的 Web 请求接口NativeWebRequest nativeRequest输入输出流InputStream/Reader获取请求体的原始输入流InputStream inputStreamOutputStream/Writer获取响应的原始输出流OutputStream outputStream安全与上下文Principal获取当前登录用户信息配合 Spring SecurityPrincipal principalLocale获取当前请求的语言区域Locale localeTimeZone获取当前请求的时区TimeZone timeZoneSpring DataPageable分页参数需引入 Spring DataPageable pageable自动解析?page0size10Sort排序参数需引入 Spring DataSort sort自动解析?sortid,desc通用封装HttpEntityT封装整个请求Headers BodyHttpEntityUser entityRequestEntityTHttpEntity的子类带更多请求信息RequestEntityUser requestEntity构建工具UriComponentsBuilder用于构建动态 URLUriComponentsBuilder builder其他可选MultipartFile接收上传的文件需搭配RequestParamRequestParam MultipartFile fileBindingAwareModelMapModel的具体实现类较少直接用BindingAwareModelMap modelMapModelAttributeSessionAttributes配合 Session 使用的属性类上标注SessionAttributes方法参数直接用ModelAttribute取特别提醒BindingResult/Errors必须紧跟在被校验的实体参数后面否则校验异常会直接抛出无法进入方法体。Pageable和Sort需要引入 Spring Data 相关依赖才能使用。以上参数可以任意组合顺序基本自由除了BindingResult必须紧跟被校验对象。3.BindingResult / Errors 必须紧跟在被校验的实体参数后面(代码说明)正确代码RestController RequestMapping(/api/user) public class UserController { PostMapping(/register) public String register( // 1. 被校验的实体 Valid RequestBody User user, // 2. BindingResult 必须紧跟其后中间不能插入任何其他参数 BindingResult result, // 3. 其他参数可以放在 BindingResult 后面 HttpSession session) { // 校验是否有错误 if (result.hasErrors()) { // 获取所有错误信息并返回 String errors result.getAllErrors() .stream() .map(ObjectError::getDefaultMessage) .collect(Collectors.joining(, )); return 校验失败 errors; } // 业务逻辑只有校验通过才会执行到这里 userService.register(user); session.setAttribute(userId, user.getId()); return 注册成功; } }错误代码PostMapping(/register) public String register( Valid RequestBody User user, // 错误中间插入了 HttpSession 参数 HttpSession session, // ← 这里插入了其他参数打断了顺序 BindingResult result) { // ← 没有紧跟被校验对象 // 即使这里有 if(result.hasErrors())也永远不会执行到这里 if (result.hasErrors()) { return 校验失败; } // 业务逻辑... return 注册成功; }

相关新闻

使用 Chainlit 调用 TextGen API + 本地 LLM 实现 RAG Chatbot 应用

使用 Chainlit 调用 TextGen API + 本地 LLM 实现 RAG Chatbot 应用

1. 引言 随着大语言模型(LLM)的快速发展,检索增强生成(RAG)已成为构建知识密集型应用的主流架构。然而,在实际部署中,我们常常面临两个核心挑战:如何快速构建一个交互式的演示界面&…

2026/7/19 9:24:06阅读更多 →
Graph 执行引擎源码:Eino 的节点调度是怎么工作的(第56篇-E42)

Graph 执行引擎源码:Eino 的节点调度是怎么工作的(第56篇-E42)

系列「企业级 AI Agent 实现拆解」E42 篇,Part 9 源码深度篇第七章。E40 讲了 ReAct Graph 的拓扑,E41 讲了 HITL 中断恢复。这篇拆最底层:Graph 编译完之后,runner 是如何驱动节点一轮一轮执行的。 读完这篇你会知道 runner 是什…

2026/7/19 9:24:06阅读更多 →
2026视频去水印教程:手机电脑免费方法与软件推荐

2026视频去水印教程:手机电脑免费方法与软件推荐

2026年日常使用短视频、素材剪辑学习的场景愈发普遍,很多人都会遇到视频自带平台水印、LOGO、文字标识的问题,影响个人收藏、素材整理和学习剪辑体验。不少用户迫切想要找到简单、免费、画质无损的去水印方式,却分不清各类工具的适配场景&…

2026/7/19 9:24:06阅读更多 →
终极指南:如何快速将GIMP界面变身为Photoshop风格

终极指南:如何快速将GIMP界面变身为Photoshop风格

终极指南:如何快速将GIMP界面变身为Photoshop风格 【免费下载链接】GimpPs Gimp Theme to be more photoshop like 项目地址: https://gitcode.com/gh_mirrors/gi/GimpPs 你是否习惯了Photoshop的操作界面,但又想使用免费开源的GIMP图像编辑软件&…

2026/7/19 14:43:04阅读更多 →
AI数字人直播“伪真人感”破译:眼动追踪精度<0.8°、微表情帧率<24fps=信任度归零(附ISO/IEC 23053认证检测流程)

AI数字人直播“伪真人感”破译:眼动追踪精度<0.8°、微表情帧率<24fps=信任度归零(附ISO/IEC 23053认证检测流程)

更多请点击: https://codechina.net 第一章:AI数字人直播“伪真人感”信任阈值解析 当观众在直播间中面对一位眼神自然流转、唇形精准同步、情绪微表情随语境起伏的AI数字人时,其心理接受并非线性增长——而是在某个临界点发生质变&#xff…

2026/7/19 14:43:04阅读更多 →
定点数的表示和运算

定点数的表示和运算

包含原码,补码,反码和二进制数的运算假如你考408,原码,补码,移位和加减比较重要无符号数定义:整个机器字长的全部二进制位均为数值位,没有符号位,相当于数的绝对值(没有正负)位二进制…

2026/7/19 14:43:04阅读更多 →
期末冲刺倒计时!用AI语音转文字抢救3年课堂录音,72小时重建知识图谱的硬核操作手册

期末冲刺倒计时!用AI语音转文字抢救3年课堂录音,72小时重建知识图谱的硬核操作手册

更多请点击: https://codechina.net 第一章:期末冲刺倒计时!用AI语音转文字抢救3年课堂录音,72小时重建知识图谱的硬核操作手册 面对堆积如山的MP3、M4A格式课堂录音(总计127小时),传统听写效…

2026/7/19 14:43:04阅读更多 →
AI提示词构建思维导图全流程拆解(从混沌输入到可视化输出的7层逻辑链)

AI提示词构建思维导图全流程拆解(从混沌输入到可视化输出的7层逻辑链)

更多请点击: https://intelliparadigm.com 第一章:AI提示词构建思维导图的底层认知范式 提示词工程并非语法拼凑,而是人类认知结构与大语言模型语义空间对齐的映射过程。其底层范式根植于三个不可分割的认知维度:意图显性化、上下…

2026/7/19 14:43:04阅读更多 →
Lyric-Getter支持的30个音乐播放器列表:QQ音乐、网易云等全覆盖

Lyric-Getter支持的30个音乐播放器列表:QQ音乐、网易云等全覆盖

Lyric-Getter支持的30个音乐播放器列表:QQ音乐、网易云等全覆盖 【免费下载链接】Lyric-Getter Lyric Getter | 酒域-歌词获取 项目地址: https://gitcode.com/gh_mirrors/ly/Lyric-Getter Lyric-Getter是一款功能强大的Android歌词获取工具,通过…

2026/7/19 14:41:03阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:01:04阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:01:04阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/18 22:49:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/18 14:49:24阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/18 18:49:35阅读更多 →