SpringMVC 模型数据
为什么80%的码农都做不了架构师?>>>
Spring MVC 通过 @RequestMapping 将请求引导到处理方法上,使用合适的方法签名将请求消息绑定到入参中。方法入参绑定请求消息只是处理方法的第一步,还有更重要的任务等待完成,即根据入参执行相应的逻辑,产生模型数据,导向到特定视图中。
如何将模型数据暴露给视图是 SpringMVC 框架的一项重要工作,SpringMVC 提供了多种途径输出模型数据:
1. @ModelAndView:处理方法返回值类型为 ModelAndView时,方法体即可通过该对象添加模型数据。
2. @ModelAttribute:方法入参标注该注解后,入参的对象就会放到数据模型中。
3. @Map 及 Model:入参为 org.springframework.ui.Model、org.soringframework.ui.ModelMap 或 java.util.Map 时,处理方法返回时,Map中的数据会自动添加到模型中。
4. @SessonAttribute:将模型中的某个属性暂时存到 HttpSession 中,以便多个请求之间可以共享这个属性。
一、ModelAndView
控制器处理方法的返回值如果为 ModelAndView,则其既包含视图信息,也包含模型数据信息,这样 SpringMVC 就可以使用视图对模型数据进行渲染了。可以简单地将模型数据看成一个 Map<String, Object>对象。
在处理方法的方法体中,可以使用如下方法添加模型对象:
1. ModelAndView addObject(String attributeName, Object attributeValue)
2. ModelAndView addAllObject(Map<String, ?> modelMap)
可以通过如下方法设置视图
1. void setView(View view):指定一个具体的视图对象
2. void setViewName(String viewName):指定一个逻辑视图名
测试:
@RequestMapping("/springmvc")
@Controller
public class SpringTest
{ //SpringMVC 会把 ModelAndView 的模型数据放到请求域中去@RequestMapping("/testModelAndView")public ModelAndView testModelAndView(){String viewName = "success";//指定跳转的逻辑视图名为 successModelAndView modelAndView = new ModelAndView(viewName);//添加模型数据到ModelAndViewmodelAndView.addObject("time", new Date());return modelAndView;}
}<body><a href="springmvc/testModelAndView">Test ModelAndView</a>
</body><body><h4>Success Page</h4>time: ${requestScope.time }
</body>
二、Map 及 Model
SpringMVC 在内部使用一个 org.springframework.ui.Model 接口存储模型数据,它的功能类似于 java.util.Map,但它比Map易用。org.springframework.ui.ModelMap实现了 Map 接口,而 org.springframework.ui.ExtendedModelMap 继承于 ModelMap 同时实现了 Model 接口。
SpringMVC 在调用方法前会创建一个隐含的模型对象,作为模型数据的存储容器,我们称之为 “隐含模型”。如果处理方法的入参为 Map 或 Model 类型,SpringMVC 会将隐含模型的引用传递给这些入参。在方法体内,开发者可以通过这个入参对象访问到模型中的所有数据,也可以向模型数据中添加新的属性数据。
测试:
//目标方法可以添加 Map 类型的参数,也可以是 Model 类型或者 ModelMap 类型的参数@RequestMapping("/testMap")public String testMap(Map<String, Object> map){map.put("names", Arrays.asList("tom", "jack", "mike"));return "success";}<a href="springmvc/testMap">Test Map</a>map: ${requestScope.names }
SpringMVC 一旦发现处理方法有 Map 或 Model 类型的入参,就会请求内在的隐含模型对象传递给这些参数,因此在方法体中可以通过这个入参对模型对象的数据进行读写操作。
二,@ModelAttribute
在方法定义上使用 @ModelAttribute 注解:SpringMVC 在调用目标处理方法前,会逐个调用在方法上标注了 @ModelAttribute 的方法
在方法的入参前使用 @ModelAttribute 注解:
1. 可以从隐含对象中获取隐含的模型数据对象,再将请求参数绑定到对象中,再传入入参
2. 将方法入参对象添加到模型中
如果希望将方法入参对象添加到模型中,仅需在相应的入参前使用@ModelAttribute注解即可,
public String list(@ModelAttribute("teachet") Teacher teachet){ Teacher teacher = new Teacher(); teacher.setAge(24); teacher.setId(1); teacher.setName("json"); return "teacher/list"; }
SpringMVC将请求消息绑定到Teacher对象中,然后再以“teacher”为键将Teacher对象放到隐藏模型中,最后在视图对象list.jsp中就可以使用${teacher.name}取值显示了。
@ModelAttribute也可以在方法上使用,SpringMVC在调用目标方法前,会先逐个调用在方法级上标注了@ModelAttribute的方法,并将这些方法的返回值添加到隐藏模型中。
注意:在②处,当获得整合版本的user对象后,会将其添加到模型中。
四,@SessionAttributes
如果希望在多个请求之间共用某个模型属性数据,则可以在控制器类标注个 @SessionAttributes,SpringMVC 会将模型中对应的属性暂存到 HTTPSession 中。
@SessionAttributes 除了可以通过属性名指定需要放到会话中的属性外,还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中。
1. @SessionAttributes(types=User.class)会将隐含模型中所有类型为 User 的属性添加到会话中
2. @SessionAttributes(value={"user1", "user2"})将名为 user1 和 user2 的模型属性添加到会话中
3. @SessionAttributes(types={"User.class", "Dept.class"})将模型中所有类型为 User 及 Dept 的属性添加到会话中
4. @SessionAtributes(value={"user1", "user2"}, types={Dept.class})将名为 user1 和 user2 的模型属性添加到会话中,同时将所有类型为 Dept 的模型属性添加到会话中
@SessionAttributes(value={"user"}, types={String.class})
@RequestMapping("/springmvc")
@Controller
public class SpringTest
{private static final String SUCCESS = "success";@RequestMapping("/testSessionAttributes")public String testSessionAttributes(Map<String, Object> map){User user = new User("Jack", "123");map.put("user", user);map.put("msg", "hello");return SUCCESS;}
}<a href="springmvc/testSessionAttributes">Test SessionAttributes</a>request user: ${requestScope.user }
<br><br>
request msg: ${requestScope.msg }
<br><br>
session user: ${sessionScope.user }
<br><br>
session msg: ${sessionScope.msg }
由结果可以看出,被 @SessionAttributes 注解修饰后,模型属性不仅存在于请求域还存在于会话域。需要注意的是@SessionAttributes 注解只能用于修饰类而不能用于方法上。
补充:
@RequestMapping(value="/helloworld")public String helloWorld(User user){return "helloworld";}
框架提前帮你写了一句model.addAttribute("user",user)。
而且特别需要注意注意,无论model中是否有key为user的属性,都要求User类有无参构造方法
转载于:https://my.oschina.net/lin546/blog/1631504
SpringMVC 模型数据相关推荐
- 【SpringMVC】SpringMVC模型数据+视图解析器
目录 一.模型数据-如何将数据存入request域 二.模型数据-如何将数据存入session域 三.@ModelAttribute 四.视图解析器 相关文章 [SpringMVC]入门篇:带你了解S ...
- SpringMVC:学习笔记(4)——处理模型数据
SpringMVC-处理模型数据 说明 SpringMVC 提供了以下几种途径输出模型数据: – ModelAndView: 处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添 ...
- SpringMVC处理模型数据
建立一个web项目,具体过程不赘述, 相关配置文件如下: web.xml <?xml version="1.0" encoding="UTF-8"?> ...
- SpringMVC项目中,jsp文件无法显示从Controller中传递过来的ModelAndView的模型数据
问题: SpringMVC项目中, jsp文件无法显示从Controller类中传递过来的ModelAndView的模型数据 原因: 并不是所有的jsp页面都支持EL表达式的, 它与web.xml版本 ...
- Java Web之SpringMVC 进行数据回显
基本介绍 数据回显:模型数据导向视图(模型数据 ---> Controller ---> 视图) 说明:SpringMVC在调用方法前会创建一个隐含的模型对象,作为模型数据的存储容器(隐含 ...
- springMVC---处理模型数据方法 *
承接一二章 index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8&quo ...
- Spring mvc 中处理模型数据 ModelAndView
Spring mvc 中处理模型数据 ModelAndView 原文: http://blog.csdn.net/jingyuan_/article/details/9625125 将模型数据暴露给 ...
- java学习笔记——springmvc 之 数据自定义转换器 数据格式化 JSR303数据校验返回与接收JSON(@RequestBody 和 @ResponseBody)
九.数据绑定流程分析 1.提出问题 日期字符串格式的表单参数,提交后转换为Date类型 <!-- 解决问题: 1.数据类型转换 2.数据格式 3.数据校验 --> BirthDay ...
- SSM学习----SpringMVC的数据响应和回写数据
文章目录 SpringMVC的数据响应方式 1.页面跳转 直接返回字符串 通过ModelAndView对象返回 方式一:自行创建ModelAndView对象 方式二:在方法中提供ModelAndVie ...
最新文章
- 吃万里路 |甜品店大盘点
- boost::hana::fuse用法的测试程序
- Windows下struct和union字节对齐设置以及大小的确定(一 简介和结构体大小的确定)...
- android访问静态内部类,Java 内部类详解
- 参考平面及其高度_施工现场平面布置关键点分析
- HDOJ 2639 Bone Collector II (背包)
- 学习python遇到的一些有趣点(每日更新)
- 可扩展多线程异步Socket服务器框架EMTASS 2.0
- python 怎么取对数_重新开始学习Python 第二十八天 Python 数学模块
- java设计模式-State模式
- CoolFire系列讲座 第4讲:字典档的维护及更新
- Unicode 汉字编码表
- 后进市场如何盈利?来看汉庭加盟经营逻辑
- 双窗格文件管理器:Commander One PRO Mac中文版
- 教育机构客户管理系统功能方案详解!
- hksi paper 1 香港证券资格考试卷一 备考经验分享(2022.10) 證券及期貨從業員資格考試
- Golang开发入门(一)
- 【Pytorch】Pytorch深度学习实战教程:超分辨率重建AI与环境搭建
- 2016华为软件精英挑战赛:赛题及其答疑汇总
- 程序运行时的内存空间分布
热门文章
- wget ip_全球IP厂商TOP 10排名:后来者虎视眈眈
- Python刷题-6
- mysql yog中文版下载_SQLyog 12
- 转list_quot;quot;转 Int,{} 转 List,还有什么奇葩的 JSON 要容错?| 实战
- 有如下MySQL表_有一个名为app的MySQL数据库表,其建表语句如下:
CR
- java commons logging_Java日志介绍(5)-commons-logging
- php的mbstring模块安装折腾记录
- matlab中nc文件,教程合集 | MATLAB文件读写(以nc与txt为例)
- mit oracle 350平衡线,MIT MI-350 CVT 平衡线_已售器材欣赏区_信谊音响_二手音响_音响发烧站_高级音响 - 音响贵族网...
- 2017.2.14-15自测(那些普及神题)