SpringMVC听课笔记(五:处理模型数据)
1. Spring MVC 提供了以下几种途径输出数据模型
-- ModelAndView: 处理方法返回值类型为ModelAndView 时,方法体即可通过该对象添加模型数据
-- Map及Model: 入参为: org.springframework.ui.Model、org.springframework.ui.ModelMap或者 java.util.Map时,处理方法返回时,Map中的数据会自动添加到模型中
-- @SessionAttributes: 将模型中的某个属性暂存到HttpSession,以便多个请求之间可以共享这个属性
-- @ModelAttribute: 方法入参标注该属性后,入参的对象就会放到数据模型中
2.ModelAndView
-- 处理器处理方法的返回值如果为ModelAndView,则既包含视图信息,又包含模型数据信息
-- 添加模型数据
-- ModelAndView addObject(String attributeName, Object attributeValue)
-- ModelAndView addAllObject(Map<String, ?> modelMap)
-- 设置视图
-- void setView(View view)
-- void setViewName(String viewName)
3. Map及 Model
-- Spring MVC 在内部使用了一个 org.springframework.ui.Model接口存储模型数据
-- 具体步骤
1)Spring MVC在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器
2)如果方法的入参为Map或者Model类型,SpringMVC会将隐含模型的引用传递给这些入参。在方法体内,开发者可以通过这个入参对象访问到的模型中的所有数据,也可以向模型中添加属性数据

4. @SessionAttributes 将数据放到了session域中,可以让多个请求公用某个属性公用。
--位置:控制类上标注 @SessionAttributes, SpringMVC将在模型中对应的属性暂存到HttpSession中
--@SessionAttributes 可以通过属性名指定需要放到会话中的属性,也可以通过模型属性的对象类型指定

例子:
-- 通过属性名

-- 通过类别

5. @ModelAttribute(pojo类型)
-- 使用情景:更新某个数据对象时,只更新一部分,前端也只传过来一部分。
如果不加ModelAttribute,那么会new 一个新的对象,更新后存到数据库,会使得部分数据为空。
如果使用了ModelAttribute,那么就会从数据库中取出这个对象,再做更新,然后存到数据库,这样使得对象的某些属性为空
-- 注意, SpringMVC在调用每个请求之前都会调用 被@ModelAttribute 注解的方法
1)未使用

2)使用后

-- 运行原理
1)执行@ModelAttribute注解修饰的方法 :从数据库中取出对象,把对象放入到Map中。 注意,键值的名字要与目标方法入参类型,第一个字母小写后的字符串一致
2)Spring MVC 从Map中取出这个对象,并把表单中的对应属性赋值
3)Spring MVC 把上述对象传入到目标方法的对象中
-- 源码分析流程(没看懂)

--Spring MVC确定 目标方法 和POJO 类型入参的过程
A)确定一个key:
1).若目标方法的pojo 类型的参数没有使用@ModelAttribute 作为修饰, 则key 为 pojo类型的第一个字母的小写后的类名字符串
2)若使用了@ModelAttribute来修饰,则key为@ModelAttribute注解的value属性值
B)在implicitModel中(被@ModelAttribute标注的方法中的map)查找key对应的对象,若存在,则作为入参传入
1)若在@ModelAttribute标记的方法中保存过,且Key与A中的key一致,则会获取到
C) 若implicitModel中不存在key对应的对象,则检查当前handler是否使用@SessionAttributes 注解修饰,若使用了该注解,且@SessionAttributes 注解的value属性值中包含了key,则会从HttpSession中来获取key 锁对应的value值,若不存在则抛出异常
D)若handler没有标识@SessionAttributes,或者 @SessionAttributes中不包含key,则会通过反射来new 一个新的pojo类型的参数,传入为目标方法的参数
E)SpringMVC 会把pojo类型的对象保存到implicitModel中,进而保存到request中
-- 流程图

SpringMVC听课笔记(五:处理模型数据)的更多相关文章
- SpringMVC:学习笔记(4)——处理模型数据
SpringMVC—处理模型数据 说明 SpringMVC 提供了以下几种途径输出模型数据: – ModelAndView: 处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添 ...
- SpringMVC 学习笔记(四) 处理模型数据
Spring MVC 提供了下面几种途径输出模型数据: – ModelAndView: 处理方法返回值类型为 ModelAndView时, 方法体就可以通过该对象加入模型数据 – Map及Model: ...
- SpringMVC听课笔记(一:SpringMVC概述)
地址 :https://www.bilibili.com/video/av14907450 版本:4.x 概述: 概要: 一:SpringMVC概述 二:SpringMVC的 HelloWorld 三 ...
- SpringMVC听课笔记(九:数据转换 & 数据格式化 & 数据校验)
1.数据绑定流程 --1). Spring MVC主框架将ServletRequest对象及目标方法入参实例传递给WebDataBinderFactory实例,以创建DataBinder实例对象. - ...
- SpringMVC听课笔记(十五:SpringMVC 运行流程)
1. 图 一般的会按照红线标注的方向去行进,但是请求静态资源,或者出现异常等,会出现其他路径 2.
- SpringMVC学习笔记五:使用converter进行参数数据转换
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6832898.html 一:SpringMVC数据绑定机制 1:request到达SpringMVC框架时,框 ...
- SpringMVC 学习笔记(五) 基于RESTful的CRUD
1.1. 概述 当提交的表单带有_method字段时,通过HiddenHttpMethodFilter 将 POST 请求转换成 DELETE.PUT请求,加上@PathVariable注解从而实现 ...
- springMVC学习笔记(五)
一.使用Ajax调用 1.1 Controller返回的类型为text类型的方式. @RequestMapping("/getPerson") public void getPer ...
- SpringMVC 学习笔记(五)
47. 尚硅谷_佟刚_SpringMVC_文件上传.avi 参看博客https://www.cnblogs.com/hanfeihanfei/p/7931758.html相当的经典 我是陌生人关于Sp ...
随机推荐
- 手写一个简单的starter组件
spring-boot中有很多第三方包,都封装成starter组件,在maven中引用后,启动springBoot项目时会自动装配到spring ioc容器中. 思考: 为什么我们springBoot ...
- python3使用configparser读取配置文件
python2中的ConfigParser在python3中改成了configparser 1.配置文件格式是 [域名] k=v 2.代码示例:需要生成conf.ini配置文件如下:[config]v ...
- Hbase集群模式搭建
1.官网下载hbase安装包 这里不做赘述. 2.解压---直接tar -zxvf xxxx 3.配置hbase集群,要修改3个文件(首先zk集群已经安装好了) 注意:要把hadoop的hdfs-si ...
- TCP实现网络通讯
Tcp server的流程:1.创建套接字:2.bind绑定ip和port3.listen使套接字变为可以被动链接:4.accept等待客户端的链接(返回为服务器分配的客户端的句柄和地址)5.reci ...
- ASP.Net中的TreeView控件中对节点的上移和下移操作
Web中的TreeView中的没有PreNode和NextNode属性. 但它的集合属性中有一个IndexOf属性,从而能够找到它的前一个节点知后一个节点. TreeView中要么只有一个根节点:要么 ...
- 第六章节 BJROBOT 动态导航壁障
导航前说明:一定要确保你小车在构建好地图的基础上进行! 1.把小车平放在你想要构建地图区域的地板上,打开资料里的虚拟机,打开一个终端, ssh 过去主控端启动 roslaunch znjrobot b ...
- 9条消除if...else的锦囊妙计,助你写出更优雅的代码
前言 最近在做代码重构,发现了很多代码的烂味道.其他的不多说,今天主要说说那些又臭又长的if...else要如何重构. 在介绍更更优雅的编程之前,让我们一起回顾一下,不好的if...else代码 一. ...
- Servlet[JAX-RS Servlet]的Servlet.init()引发异常
代码环境 Eclipse2017 : 问题出现: 在测试Hello servlet时发生 org.apache.catalina.core.ApplicationContext log严重: Serv ...
- 风炫安全WEB安全学习第二十七节课 XSS的防御措施
风炫安全WEB安全学习第二十七节课 XSS的防御措施 XSS防御措施 总的原则 控制好输入/输出 过滤:根据业务需求进行过滤,对email,手机号码这样的输入框进行验证. 转义:所有输出到前端的数据都 ...
- Solon rpc 之 SocketD 协议
1. 简介 SocketD 是一种二进制的点对点通信协议,是一种新的网络通信第七层协议.旨在用于分布式应用程序中.从这个意义上讲,SocketD可以是RSocket等其他类似协议的替代方案.它的消息协 ...