Spring MVC中Controller是如何把数据传递给View的?
在 Spring MVC 中,Controller 负责请求的处理,准备需要展示的数据,并将这些数据传递给 View,由 View 负责最终的页面渲染。数据从 Controller 传递到 View 主要通过模型 (Model) 实现。
Spring MVC 提供了以下几种方式让 Controller 将数据添加到模型中,然后将模型传递给视图:
-
使用
Model
接口作为 Controller 方法参数 (推荐)- 这是目前最常用和推荐的方式。可以在 Controller 方法的参数列表中声明一个
org.springframework.ui.Model
类型的参数。 - Spring MVC 在调用方法时会自动创建一个
Model
实例并将其传递给方法。 - 可以使用
model.addAttribute(key, value)
方法向模型中添加属性,其中key
是属性名(字符串),value
是要传递的数据对象。View 将使用这个key
来访问数据。
import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam;@Controller public class UserController {@GetMapping("/greeting")public String greeting(@RequestParam(name="name", required=false, defaultValue="World") String name, Model model) {// 准备数据String message = "Hello, " + name + "!";// 将数据添加到模型中,key 是 "greetingMessage"model.addAttribute("greetingMessage", message);model.addAttribute("pageTitle", "Greeting Page"); // 可以添加多个属性// 返回视图名return "greetingView"; // Spring MVC 会找到名为 greetingView 的视图来渲染} }
在
greetingView
这个视图(例如 JSP, Thymeleaf 模板等)中,我们可以通过greetingMessage
和pageTitle
这两个 key 来访问模型中的数据。 - 这是目前最常用和推荐的方式。可以在 Controller 方法的参数列表中声明一个
-
使用
Map
或ModelMap
作为 Controller 方法参数ModelMap
是LinkedHashMap
的子类,也实现了Map
接口,提供了与Model
相似的功能 (addAttribute
方法)。Map
接口也可以直接使用。- 它们的行为与
Model
接口基本相同,都是向模型中添加键值对数据。
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import java.util.Map;@Controller public class ProductController {@GetMapping("/productDetails")public String showProductDetails(Map<String, Object> model) {// 准备数据Product product = productService.getProductById(123L);// 将数据添加到 Map (模型) 中model.put("product", product);model.put("currency", "USD");// 返回视图名return "productDetailsView";} }
在
productDetailsView
视图中,可以通过product
和currency
访问数据。 -
使用
ModelAndView
返回值ModelAndView
是 Spring MVC 早期常用的类,它将模型数据和视图名封装在一个对象中返回。- 通过
addObject(key, value)
添加模型数据,通过setViewName(viewName)
设置视图名。
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.servlet.ModelAndView;@Controller public class OrderController {@GetMapping("/orderDetails")public ModelAndView showOrderDetails() {// 准备数据Order order = orderService.getOrderById(456L);// 创建 ModelAndView 对象ModelAndView mav = new ModelAndView();// 添加模型数据mav.addObject("order", order);mav.addObject("status", "Shipped");// 设置视图名mav.setViewName("orderDetailsView");return mav;} }
在
orderDetailsView
视图中,可以通过order
和status
访问数据。 -
使用
@ModelAttribute
标注方法- 可以在 Controller 类中定义一个方法,并使用
@ModelAttribute
标注它。 - 这个方法会在 Controller 的请求处理方法执行之前被调用。
- 该方法的返回值(通过参数
Model
添加的数据)会自动添加到模型中,供当前 Controller 的所有方法以及最终的视图使用。常用于添加一些公共的、所有视图都需要的数据(如导航信息、用户登录状态等)。
import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute;@Controller public class CommonDataController {// 这个方法会在每次处理请求前执行@ModelAttributepublic void addCommonData(Model model) {model.addAttribute("appName", "My Awesome App");model.addAttribute("currentUser", "Guest"); // 实际应用中这里会获取当前登录用户}@GetMapping("/home")public String homePage() {// homeView 视图可以直接访问 appName 和 currentUserreturn "homeView";}@GetMapping("/about")public String aboutPage() {// aboutView 视图也可以访问 appName 和 currentUserreturn "aboutView";} }
在
homeView
和aboutView
中,都可以访问appName
和currentUser
。 - 可以在 Controller 类中定义一个方法,并使用
-
通过 Controller 方法的返回值 (当返回值不是 String, View, ModelAndView 等特殊类型时)
- 如果 Controller 方法返回一个 POJO 对象,并且没有
@ResponseBody
注解,Spring MVC 会尝试将这个返回值也添加到模型中。默认情况下,属性名会根据返回值的类型自动生成(例如,返回User
对象,属性名可能是 “user” 或 “aUser”)。
- 如果 Controller 方法返回一个 POJO 对象,并且没有
数据如何到达 View?
当 Controller 方法执行完毕,Spring MVC 会将模型中的数据(通常存储在一个 Map
或 ModelMap
对象中)放入到请求属性 (Request Attributes) 中。然后,Spring MVC 将控制权交给选定的 View。
不同的 View 技术访问请求属性的方式不同:
- JSP/JSTL/EL (Expression Language): 可以直接使用 EL 表达式访问模型中的属性,例如
${greetingMessage}
,${user.name}
。 - Thymeleaf: 使用 OGNL 或 Spring EL 表达式,例如
<p th:text="${greetingMessage}"></p>
,<span th:text="${product.price}"></span>
。 - Freemarker: 使用
${greetingMessage}
,${user.name}
。
总结传递数据的过程:
- Controller 通过
Model
、Map
、ModelAndView
或@ModelAttribute
方法将数据以键值对的形式添加到 Spring 管理的模型中。 - Spring MVC 在处理请求的后期,将模型中的数据复制到当前请求的属性中 (
HttpServletRequest
的属性)。 - Spring MVC 委托 ViewResolver 找到对应的 View(例如 JSP 文件)。
- View 引擎(例如 JSP 容器、Thymeleaf 引擎)在渲染页面时,可以从请求属性中获取到 Controller 放入的模型数据,并将其呈现在最终的 HTML 或其他格式的响应中。
选择哪种方式取决于具体使用场景。使用 Model
参数是最灵活的方式,它将模型的管理与视图名分开来返回,使 Controller 方法更清晰。ModelAndView
适合模型数据和视图名紧密关联、一起返回的场景。@ModelAttribute
适合跨多个请求处理的公共数据。
相关文章:
Spring MVC中Controller是如何把数据传递给View的?
在 Spring MVC 中,Controller 负责请求的处理,准备需要展示的数据,并将这些数据传递给 View,由 View 负责最终的页面渲染。数据从 Controller 传递到 View 主要通过模型 (Model) 实现。 Spring MVC 提供了以下几种方式让 Control…...
FAST-LIO笔记
1.FAST-LIO FAST-LIO 是一个计算效率高、鲁棒性强的激光-惯性里程计系统。该系统通过紧耦合的迭代扩展卡尔曼滤波器(IEKF)将激光雷达特征点与IMU数据进行融合,使其在快速运动、噪声较大或环境复杂、存在退化的情况下仍能实现稳定的导航。 1…...
挑战用豆包教我学Java01天
今天是豆包教我学Java的第一天,废话不多说直接开始。 1.每日题目: 基础语法与数据类型 题目:编写一个 Java 程序,从控制台读取两个整数,然后计算它们的和、差、积、商,并输出结果。题目:编写…...
基于RT-Thread的STM32G4开发第二讲第二篇——ADC
文章目录 前言一、RT-Thread工程创建二、ADC工程创建三、ADC功能实现1.ADC.c2.ADC.h3.mian.c 四、效果展示和工程分享总结 前言 本文使用的是RT-Thread最新的驱动5.1.0,兼容下面的所有驱动。使用的开发板是蓝桥杯嵌入式国信长安的开发板,MCU是STM32G431…...
居民健康监测小程序|基于微信小程序的居民健康监测小程序设计与实现(源码+数据库+文档)
居民健康监测小程序 目录 基于微信小程序的居民健康监测小程序设计与实现 一、前言 二、系统设计 三、系统功能设计 1、用户信息管理 2、健康科普管理 5.3公告类型管理 3、论坛信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 …...
电商双11美妆数据分析
图中展示的是在Jupyter Notebook环境下的Python代码及运行结果。代码利用 seaborn 和 matplotlib 库,以 datal 数据集为基础,绘制上下两个子图。上方子图呈现各店铺中各大类的销售量,下方子图展示各店铺中各大类的销售额,通过条形…...
Spark-Core(双Value类型)
一、RDD转换算子(双Value类型) 1、intersection 函数签名: def intersection(other: RDD[T]): RDD[T] 函数说明:对源 RDD 和参数 RDD 求交集后返回一个新的 RDD 举栗: val dataRDD1 sparkContext.makeRDD(List(…...
【数据库原理及安全实验】实验六 角色访问控制
指导书原文 安全性管理二 【实验目的】 1) 通过语句设置登录用户的权限,实现对不同用户的操作权限的限定。 【实验原理】 1) 定义数据库角色,授予该角色特定权限,建立不同的用户将其置入不同的角色之下,即等于分配了该用户不…...
windows安装micromamba
windows安装 winget install Mamba.Micromamba Set-ExecutionPolicy RemoteSigned micromamba activate 第一次运行会报错,把报错中间那一句init代码跑一下 创建环境什么的和conda一样 把conda换成micromamba就行 绑定快捷键,winget安装&#x…...
vue-quill-editor的失焦事件
vue-quill-editor的用法再此就不再赘述了,只记录我在使用过程中踩的坑。 版本:Vue2 vue-quill-editor3.0.6 封装组件: <vue-quill-editorclass"editor":class"dynamicClasses"ref"myTextEditor"v-model&quo…...
【工具变量】最新华证ESG评级得分数据-含xlsx及dta格式(2009-2024.12)
参考《经济研究》中方先明(2023)的做法,将华证ESG评级进行赋值,指标包含C、CC、CCC、B、BB、BBB、A、AA、AAA共9个等级,将上市公司ESG等级从低到高分别赋值为1至9。将华证ESG评级得分数据更新至2024年12月31日…...
【纯小白博客搭建】Hugo+Github博客部署及主题(stack)美化等界面优化记录
这里写目录标题 HugoGithub博客部署及主题(stack)美化等界面优化写在前面hugo博客搭建教程第一种方案第二种方案 添加浏览量和统计字数添加评论功能添加访客地图 HugoGithub博客部署及主题(stack)美化等界面优化 效果图如下 如果…...
题解:CF2107E Ain and Apple Tree
首先考虑无解的情况。 当这棵树为一条链时,答案取到最大值。证明很简单,假设存在一个节点 u u u 至少有 2 2 2 个孩子节点,任取两个 v 1 , v 2 v_1,v_2 v1,v2,则 dep ( LCA ( v 1 , v 2 ) ) dep ( u ) \text{dep}(\o…...
STM32的看门狗
独立看门狗(IWDG) IWDG简介 独立看门狗(Independent Watchdog,通常缩写为IWDG)主要作用是主要用于检测外界电磁干扰,或硬件异常导致的程序跑飞问题。 WDG本质上是一个12位的递减计数器(滴答定…...
小王包子铺的融资过程以及IPO上市过程
用包子铺来打个通俗易懂的比喻,一步步讲清楚从创业到融资上市的全过程。 🥟 故事背景:老王的包子铺 老王做的包子特别好吃,于是他决定不再只是摆摊,而是创办一家叫 “老王包子铺” 的连锁店。我们就以老王创业为线索&…...
WPF 触发器 Trigger
触发器 Trigger 触发器(Trigger)是 WPF 中的一种机制: 当某个条件满足时,自动改变控件的某些属性,比如颜色、大小、透明度等。 换句话说,就是"如果……那么就……" 的一种规则。 常见触发器类…...
CentOS算法部署
CentOS服务部署 第一章 启动两个算法服务第一步:上传算法文件第二步:安装 tmux第三步:启动服务(1) 启动第一个算法服务(2) 启动第二个算法服务 第四步:关闭防火墙 第一章 启动两个算…...
极狐GitLab 命名空间的类型有哪些?
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 命名空间 命名空间在极狐GitLab 中组织项目。因为每一个命名空间都是单独的,您可以在多个命名空间中使用相同的项…...
使用 Apache POI 生成包含文本和图片的 Word 文档
一、概述 在实际开发场景中,我们经常需要自动生成包含文本和图片的 Word 文档。本示例借助 Apache POI 库,实现了向 Word 文档中插入文本和图片的功能。代码会循环插入多次文本和同一张图片,并且对图片进行等比缩放处理,以保证图片…...
Eclipse通过Tomcat启动web项目报错
错误内容:Caused by: java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext。 本来运行的好好的,执行了Maven->Update Porject后就报上面的错。 通过检查发现,执行上面的命令后会将下面截图中的maven depen…...
5.7线性动态规划1
P2285 [HNOI2004] 打鼹鼠 #include<bits/stdc.h> using namespace std; struct node{int x, y, t; }a[100010]; int dp[100010]; void solve(){int n, m; cin >> n >> m;for(int i 1; i < m; i){cin >> a[i].t >> a[i].x >> a[i].y;}…...
Word如何制作三线表格
1.需求 将像这样的表格整理成论文中需要的三线表格。 2.直观流程 选中表格 --> 表格属性中的边框与底纹B --> 在设置中选择无(重置表格)–> 确定 --> 选择第一行(其实是将第一行看成独立表格了,为了设置中线&…...
【Mybatis-plus常用语法】
MyBatis-Plus 是 MyBatis 的增强工具,提供了很多便捷的功能来简化开发。以下是一些 MyBatis-Plus 的常见语法: 实体类注解:使用 TableName 注解来指定实体类和数据库表的映射关系。 TableName("user") public class User {privat…...
16.Excel:数据收集
一 使用在线协作工具 简道云。 excel的在线表格协作在国内无法使用,而数据采集最需要在线协作。 二 使用 excel 1.制作表格 在使用excel进行数据采集的时候,会制作表头给填写人,最好还制作一个示例。 1.输入提示 当点击某个单元格的时候&am…...
基于Django框架开发的企业级IT资产管理系统
CMDB 资产管理系统 资产管理系统是一个基于Django框架开发的企业级IT资产管理平台,专注于数据中心和IT设备的全生命周期管理。该系统提供了完整的资产管理功能,包括设备管理、数据中心管理、用户权限管理等核心功能。 项目截图 技术栈 后端 Python 3…...
Redis 集群版本升级指南:从 Redis 7 升级到 Redis 8
Redis 集群升级主要有两种方案: 1、在线滚动升级(无需停机) 2、停机升级(需停止服务) 一、准备工作 1. 下载 Redis 8 安装包 # Redis 8.0.0 示例(请替换为实际版本) http://download.redis.io…...
使用 Couchbase Analytics Service 的典型步骤
下面是使用 Couchbase Analytics Service 的典型步骤,包括部署、配置、创建数据集、运行查询以及监控优化等环节。 首先,您需要安装并启用 Analytics 服务;然后将节点加入集群并重平衡;接着在 Analytics 中映射数据服务的集合&am…...
C++ stl中的vector的相关用法 迭代器失效问题
文章目录 vector的介绍及使用vector的定义 vector的空间相关问题vector的迭代器的使用vector的增删查改vector迭代器失效问题 vector的介绍及使用 1、vector是用于表示可变大小数组的序列容器。 2、vector就像数组一样,采用的是连续的空间来存储元素,也…...
【Redis】哨兵机制和集群
🔥个人主页: 中草药 🔥专栏:【中间件】企业级中间件剖析 一、哨兵机制 Redis的主从复制模式下,一旦主节点由于故障不能提供服务,需要人工的进行主从切换,同时需要大量的客户端需要被通知切换到…...
uni-app 引入vconsole web端正常,安卓端报错 Cannot read property ‘sendBeacon‘ of undefined
reportJSException >>>> exception function:createInstanceContext, exception:white screen cause create instanceContext failed,check js stack ->Uncaught TypeError: Cannot read property sendBeacon of undefined vconsole 只支持 web 端,…...
数据管道的解耦艺术:Dagster I/O管理器实现存储与逻辑分离
在现代数据工程中,高效管理数据的读写逻辑是构建可维护管道的关键。Dagster的**I/O管理器(I/O Managers)**通过分离数据处理与数据存储逻辑,显著提升了代码的可复用性和灵活性。本文将深入解析其核心概念、应用场景及实战示例。 一…...
shell脚本--2
1、实时监控cpu、内存的shell脚本 #!/bin/bash# 获取当前时间 DATE$(date "%Y-%m-%d %H:%M:%S")# 获取CPU使用情况 CPU_USAGE$(top -b -n1 | grep "Cpu(s)" | awk {print $2 $4})# 获取内存使用情况 MEMORY_USAGE$(free | grep Mem | awk {print $3/$2 *…...
jenkins配置多nexus仓库多maven版本
jenkins多环境多nexus仓库,多maven版本 使用优化,jenkins多环境多nexus仓库,多maven版本 1、多settings.xml设置构建 背景:jenkins本地安装一个maven版本,默认只有一个settings.xml文件指定本地和远端nexus仓库&#x…...
Linux理解文件fd
先来段代码回顾C文件接口 myfile.c写文件 #include <stdio.h>int main() {FILE *fp fopen("log.txt","a");if(NULL fp){perror("fopen");return 1;}fprintf(fp,"helloWorld,%d,%s,%lf\n",10,"lsf",3.14);fclose(fp)…...
【Python】os模块
os 模块是 Python 标准库中用于与操作系统交互的核心模块,提供了许多操作文件和目 录的函数。 1. 基本介绍 os 模块提供了以下主要功能: 文件和目录操作路径操作进程管理环境变量访问 import os2. 常用功能分类 2.1 文件和目录操作 函数/方法描述o…...
2025 Mac常用软件安装配置
1、homebrew 2、jdk 使用brew安装jdk: 配置环境变量: 3、maven 使用brew安装maven: 配置环境变量: 4、光标平滑移动 5、鼠标滚轮调整 mos 6、常用的终端工具 tabby 7、软件卸载 腾讯柠檬:https://lemon.qq.com/ 8、…...
PyQt5 实现自定义滑块,效果还不错
最近,黄老师闲来无事,需要做一个 播放器的滑块,但是Qt官方的长这个样子,不太好看 于是我自己写了一个,效果还不错,请看下面的效果图: 功能可以点击,可以拖拽改变进度,和播放器的进度条一样 源码如下: 需要的自取 import sys from PyQt5.QtWidgets import QApplicat…...
如何在ENVI Classic 和 ENVI中进行波段合成
示例使用Landsat的三个波段进行合成为示例,合成后展示为假彩色。 对应关系为: Red -- b4(近红外 near-infrared)NIR Green -- b3 (红光 Red) Blue -- b2 (绿光 Green) 一、ENVI…...
协方差与皮尔逊相关系数:从定义到应用的全面解析
目录 一、协方差与皮尔逊相关系数的定义1.1 协方差(Covariance)1.2 皮尔逊相关系数(Pearson Correlation Coefficient) 二、协方差的定义与推导逻辑2.1 核心目标:衡量变量的“协同变化”2.2 数学表达的直观性2.3 从线性…...
ICML 2025录取率公布,spotlight posters仅占2.6%
近日,ICML 2025公布了论文录用结果。本次大会共收到 12,107篇有效论文投稿,比去年增加了28%,今年录取论文3,260篇,录取率为 26.9%。其中仅有313篇被列为“焦点海报”(即所有投稿中排名前2.6%的论文)&#x…...
kotlin一个函数返回多个值
一、主要实现方式 1. Pair/Triple 元组 用途:临时快速返回 2 或 3 个简单值,适用于简单场景语法: fun getStatus(): Pair<Int, String> {return Pair(200, "Success") // 等价于 200 to "Success" }// 解构接收 …...
Clojure 学习笔记
Clojure哲学 1.又一种Lisp? 优美、灵活、代码即数据。 实现一门程序设计语言,代码同数据一般对待,这需要语言本身具有非常强的可塑性。当语言就是以这种本质的数据结构表现时,语言本身就可以操作自己的结构和行为了。 2.函数式编…...
5.7 react 路由
react 状态管理库 14:20 react 路由(补充) 数据路由 路由hooks 路由跳转 (方法 标签/内置方法) 获取路由地址栏信息 动态路由实现(多角色权限路由) redux redux-toolkit 状态管理 antd 组件使用 1.…...
8. HTML 表单基础
表单是网页开发中与用户交互的核心组件,用于收集、验证和提交用户输入的数据。本文将基于提供的代码素材,系统讲解 HTML 表单的核心概念、常用控件及最佳实践。 一、表单的基本结构 一个完整的 HTML 表单由以下部分组成: <form action&q…...
遥感数据处理、机器学习建模与空间预测的全流程指南——涵盖R语言(随机森林、XGBoost、SVM等)、特征提取、模型优化及生态学案例分析
随机森林是一种强大的集成学习方法,特别适用于复杂的遥感数据分析。它通过构建多棵决策树并引入随机性,有效降低模型的方差和过拟合风险。在训练过程中,随机森林利用Bootstrap抽样生成多样化的训练集,并在节点分裂时随机选择特征子…...
Android 数据持久化之数据库存储 Room 框架
一、简介 Room 是 Google 推出的 Android 持久层框架,建立在 SQLite 之上,提供了一个抽象层,简化了数据库操作。它通过注解和编译时检查来确保数据操作的正确性。 Room 主要由以下三个组件组成: Entity(实体&#x…...
空间数据分析新趋势:AI 与 ArcGIS Pro 的协同创新
技术点目录 AI(DeepSeek、ChatGPT)大模型介绍及应用AI(DeepSeek、ChatGPT)支持下空间数据处理及分析功能基础AI(DeepSeek、ChatGPT)支持下空间数据选择及读取AI(DeepSeek、ChatGPT)支…...
Oracle OCP认证考试考点详解083系列10
题记: 本系列主要讲解Oracle OCP认证考试考点(题目),适用于19C/21C,跟着学OCP考试必过。 46. 第46题: 题目 解析及答案: 查看以下配置: CDB1 和 CDB2 是两个容器数据库。 PDB1 是 CDB1 中的一…...
【linux常用指令】du命令
今天收到通知需要将服务器上的容量大的文件移动到大容量数据盘中。 du -sh */ | sort -h如果你想按大小排序显示文件夹,可以结合 sort 命令。这会按大小从小到大排序显示文件夹。如果想按大小从大到小排序,可以加上 -r 选项。 du -sh */ | sort -h -r...
统一返回JsonResult踩坑
定义了一个统一返回类,但是没有给Data 导致没有get/set方法,请求一直报错 public class JsonResult<T> {private int code;private String message;private T data;public JsonResult() {}public JsonResult(int code, String message, T data) {…...