目录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 注册成功; }
企业数字化 ERP 产品动态
相关推荐
2026网页端去水印教程:图片视频通用,靠谱平台优缺点解析 日常整理个人素材、处理收藏的图片与短视频时,角落水印、平台logo、文字遮挡等问题十分影响观感。很多用户纠结于找不到合适的工具,要么需要下载软件占用设备内存,要么广告弹窗繁多、操作复杂,要么处理后画质严重受损。2026年主流… · 2026/9/14 2:13:14
第三阶段:高级深耕期 — Zephyr RTOS 图解内核篇 第三阶段:高级深耕期 — Zephyr RTOS 内核篇 1. 阶段目标
完成本阶段学习后,你将具备以下 4 项核心能力: 源码级调试能力:能够阅读并理解 Zephyr 内核核心源码,熟练使用代码地图定位关键模块,快速诊断系统级问题。 BSP 移植能力:掌握将 Zephyr 移植到全新硬件平台的完整… · 2026/9/15 13:58:45
基于PHP的H5转APP在线封装打包平台实现与避坑指南 简介:面向需要把H5手机网站快速封装成安卓和苹果安装包的开发者,这套PHP源码以在线打包方式提供免签绿色封装方案,支持Android与iOS平台。可自行上传安卓证书和启动图,并针对iOS 14全屏兼容问题做了专门修复;同时去除多… · 2026/9/25 23:06:21
GEOFlow API v1开发者完整指南:用REST接口全自动驱动GEO运营工作流 GEOFlow API v1开发者完整指南:用REST接口全自动驱动GEO运营工作流 【免费下载链接】GEOFlow Open-source GEO content engineering and multi-site distribution platform with AI quality inspection, illustrated admin help, hosted sites, browser-assisted pu… · 2026/9/25 23:05:48
8B模型LoRA微调营销文案:数据准备、训练参数与Ollama部署 简介:面向具备机器学习基础的技术人员与市场营销从业者,一套围绕AI模型高效训练的实战指南,核心思路是先借助大型模型生成多样化营销训练数据,再通过Unsloth微调8B小模型,使其在广告文案、社交话题等营销内容生成上接近… · 2026/9/25 23:05:36
基于私有知识库的LLM智能客服问答系统:从RAG到私有化部署实战 简介:这套资源是基于企业私有知识库的大语言模型智能客服问答系统,支持私有化部署,主要面向企业技术团队、AI应用开发者以及需要搭建内部智能问答平台的管理者,尤其适合对数据安全有较高要求的场景。资源包共1302个文件࿰… · 2026/9/25 23:05:29
MaaEnd节点测试教程:如何用测试用例验证识别稳定命中 MaaEnd节点测试教程:如何用测试用例验证识别稳定命中 【免费下载链接】MaaEnd MaaEnd 终末地小助手:基于视觉 AI 的「明日方舟:终末地」自动化工具 项目地址: https://gitcode.com/gh_mirrors/maa/MaaEnd
MaaEnd 是基于视觉 AI 的《明… · 2026/9/25 23:05:29
Apache Pulsar Functions 快速入门实战:从本地运行到集群部署 消息队列后端流处理 【免费下载链接】pulsar Apache Pulsar - distributed pub-sub messaging system 项目地址: https://gitcode.com/gh_mirrors/pulsar28/pulsar 点击查看 免费下载 本指南以 Apache Pulsar 的 Pulsar Functions 轻量级流处理模型为主题ÿ… · 2026/9/25 23:05:29
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37