为什么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 注解只能用于修饰类而不能用于方法上

补充:

如果Model中没有key为user的属性,并且没写@ModelAttribute("user"),由于参数列表中有User user对象入参,则Spring会将该对象放入model,并且key值为首字母小写的类名,也就是说对于方法:
 @RequestMapping(value="/helloworld")public String helloWorld(User user){return "helloworld";}

框架提前帮你写了一句model.addAttribute("user",user)。
而且特别需要注意注意,无论model中是否有key为user的属性,都要求User类有无参构造方法

参考: https://www.cnblogs.com/2015110615L/p/5629461.html

转载于:https://my.oschina.net/lin546/blog/1631504

SpringMVC 模型数据相关推荐

  1. 【SpringMVC】SpringMVC模型数据+视图解析器

    目录 一.模型数据-如何将数据存入request域 二.模型数据-如何将数据存入session域 三.@ModelAttribute 四.视图解析器 相关文章 [SpringMVC]入门篇:带你了解S ...

  2. SpringMVC:学习笔记(4)——处理模型数据

    SpringMVC-处理模型数据 说明 SpringMVC 提供了以下几种途径输出模型数据: – ModelAndView: 处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添 ...

  3. SpringMVC处理模型数据

    建立一个web项目,具体过程不赘述, 相关配置文件如下: web.xml <?xml version="1.0" encoding="UTF-8"?> ...

  4. SpringMVC项目中,jsp文件无法显示从Controller中传递过来的ModelAndView的模型数据

    问题: SpringMVC项目中, jsp文件无法显示从Controller类中传递过来的ModelAndView的模型数据 原因: 并不是所有的jsp页面都支持EL表达式的, 它与web.xml版本 ...

  5. Java Web之SpringMVC 进行数据回显

    基本介绍 数据回显:模型数据导向视图(模型数据 ---> Controller ---> 视图) 说明:SpringMVC在调用方法前会创建一个隐含的模型对象,作为模型数据的存储容器(隐含 ...

  6. springMVC---处理模型数据方法 *

    承接一二章 index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8&quo ...

  7. Spring mvc 中处理模型数据 ModelAndView

    Spring mvc 中处理模型数据  ModelAndView 原文: http://blog.csdn.net/jingyuan_/article/details/9625125 将模型数据暴露给 ...

  8. java学习笔记——springmvc 之 数据自定义转换器 数据格式化 JSR303数据校验返回与接收JSON(@RequestBody 和 @ResponseBody)

    九.数据绑定流程分析 1.提出问题 日期字符串格式的表单参数,提交后转换为Date类型 <!--    解决问题: 1.数据类型转换 2.数据格式 3.数据校验 --> BirthDay ...

  9. SSM学习----SpringMVC的数据响应和回写数据

    文章目录 SpringMVC的数据响应方式 1.页面跳转 直接返回字符串 通过ModelAndView对象返回 方式一:自行创建ModelAndView对象 方式二:在方法中提供ModelAndVie ...

最新文章

  1. 吃万里路 |甜品店大盘点
  2. boost::hana::fuse用法的测试程序
  3. Windows下struct和union字节对齐设置以及大小的确定(一 简介和结构体大小的确定)...
  4. android访问静态内部类,Java 内部类详解
  5. 参考平面及其高度_施工现场平面布置关键点分析
  6. HDOJ 2639 Bone Collector II (背包)
  7. 学习python遇到的一些有趣点(每日更新)
  8. 可扩展多线程异步Socket服务器框架EMTASS 2.0
  9. python 怎么取对数_重新开始学习Python 第二十八天 Python 数学模块
  10. java设计模式-State模式
  11. CoolFire系列讲座 第4讲:字典档的维护及更新
  12. Unicode 汉字编码表
  13. 后进市场如何盈利?来看汉庭加盟经营逻辑
  14. 双窗格文件管理器:Commander One PRO Mac中文版
  15. 教育机构客户管理系统功能方案详解!
  16. hksi paper 1 香港证券资格考试卷一 备考经验分享(2022.10) 證券及期貨從業員資格考試
  17. Golang开发入门(一)
  18. 【Pytorch】Pytorch深度学习实战教程:超分辨率重建AI与环境搭建
  19. 2016华为软件精英挑战赛:赛题及其答疑汇总
  20. 程序运行时的内存空间分布

热门文章

  1. wget ip_全球IP厂商TOP 10排名:后来者虎视眈眈
  2. Python刷题-6
  3. mysql yog中文版下载_SQLyog 12
  4. 转list_quot;quot;转 Int,{} 转 List,还有什么奇葩的 JSON 要容错?| 实战
  5. 有如下MySQL表_有一个名为app的MySQL数据库表,其建表语句如下: CR
  6. java commons logging_Java日志介绍(5)-commons-logging
  7. php的mbstring模块安装折腾记录
  8. matlab中nc文件,教程合集 | MATLAB文件读写(以nc与txt为例)
  9. mit oracle 350平衡线,MIT MI-350 CVT 平衡线_已售器材欣赏区_信谊音响_二手音响_音响发烧站_高级音响 - 音响贵族网...
  10. 2017.2.14-15自测(那些普及神题)