想要将数据拿到页面给展现出来,最容易想到的是放到WEB域中,然后再取出,这篇文章记录一下不同于传统的WEB域数据输出的几种方式

使用 Map、Model、ModelMap进行传值

Spring MVC 在内部使用了一个org.springframework.ui.Model接口存储模型数据 具体步骤:

  • 1、Spring MVC 在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器。
  • 2、如果方法的入参为 Map 或 Model 类型,Spring MVC 会将隐含模型的引用传递给这些入参。在方法体内,开发者可以通过这个入参对象访问到模型中的所有数据,也可以向模型中添加新的属性数据。

示例:
Model演示

@RequestMapping("/outputData")public String output1(Model model){model.addAttribute("msg", "我是output1()");return "hello";}

jsp页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>Title</title>
</head>
<body><h1>${msg}</h1>
</body>
</html>

浏览器访问:
Map演示

  @RequestMapping("outputData1")public String output2(Map map){map.put("msg", "我是output2()");return "hello";}

浏览器访问:

ModelMap演示

  @RequestMapping("outputData2")public String output3(ModelMap modelMap){modelMap.addAttribute("msg", "我是output3()");return "hello";}

浏览器访问:

Map、Model、ModelMap:最终都是保存在 BindingAwareModelMap 在工作。这些参数里面保存的所有数据都会在请求域中,这几种方式传递的值只能通过request获取。

ModelAndView传值

控制器处理方法的返回值如果为 ModelAndView, 则其既包含视图信息,也包含模型数据信息。
添加模型数据:

  • MoelAndView addObject(String attributeName, Object attributeValue)
  • ModelAndView addAllObject(Map<String, ?> modelMap)
    设置视图:
  • void setView(View view)
  • void setViewName(String viewName)
  • 也可以在对象创建时通过构造器设置视图
 @RequestMapping("/outputData3")public ModelAndView output4(){ModelAndView modelAndView = new ModelAndView("hello");modelAndView.addObject("msg", "我本楚狂人,凤歌笑孔丘");return modelAndView;}@RequestMapping("/outputData4")public ModelAndView output5(){ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("hello");modelAndView.addObject("msg", "我本楚狂人,凤歌笑孔丘");return modelAndView;}

访问任意一个结果都是一样的。
浏览器访问:

@SessionAttributes

  • 若希望在多个请求之间共用某个模型属性数据,则可以在控制器类上标注一个@SessionAttributes, Spring MVC 将在模型中对应的属性暂存到 HttpSession 中。
  • @SessionAttributes 除了可以通过属性名指定需要放到会话中的属性外,还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中
  • @SessionAttributes(types=User.class) 会将隐含模型中所有类型为 User.class 的属性添加到会话中。
    • @SessionAttributes(value={“user1”, “user2”})
    • @SessionAttributes(types={User.class, Dept.class})
    • @SessionAttributes(value={“user1”, “user2”}, types={Dept.class})

示例:

@Controller
@SessionAttributes(value = "msg")
public class HelloController {@RequestMapping("/session1")public String sessionTest1(Model model){model.addAttribute("msg", "我本楚狂人,凤歌笑孔丘");return "hello";}

jsp页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>Title</title>
</head>
<body><h1>${requestScope.msg}</h1><hr><h1>${sessionScope.msg}</h1>
</body>
</html>

结构:

注意:

  • 给BindingAwareModelMap中保存的数据,或者在ModelAndView中的数据,同时给session中放一份;
  • Value的值就是保存数据是要给session中放的数据的key,这个key的值要和在ModelAndView、BindingAwareModelMap中保存数据的key的值一样,否则不会保存到session中即:BindingAwareModelMap中保存了数据,但是value的值不包含保存数据的key,就不能存在session中去。
  • @SessionAttributes(value={“msg”, “haha”}):保存多个数据到session中去。
  • @SessionAttributes(types = {String.class}):根据保存在BindingAwareModelMap、ModelAndView中的数据的类型只要与这个注解设置的相同,就保存在session,数据的key与BindingAwareModelMap、ModelAndView中保存的数据的key相同。

@ModelAttribute

  • 在方法定义上使用 @ModelAttribute 注解:Spring MVC 在调用目标处理方法前,会先逐个调用在方法级上标注了 @ModelAttribute 的方法。
  • 在方法的入参前使用 @ModelAttribute 注解:可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数绑定到对象中,再传入入参将方法入参对象添加到模型中

使用场景
如果我们执行某一个请求映射方法之前,想要相对数据进行一些处理,则可以使用@ModelAttribute注解。

   @RequestMapping("/peopleTest")public String test(@ModelAttribute("people") People people, Model model){System.out.println(people);return "hello";}@ModelAttributepublic void before(Model model){People people = new People("张三", 18, new Department(1, "营销部"));model.addAttribute("people", people);}

浏览器访问:

控制台输出:
在before方法的参数Model中存放数据,实际上还是存放在BindingAwareModelMap中,标注在目标方法的参数中,通过key的值,取出刚刚在Map中保存的数据。
值的注意的是:在这两个方法中,参数ModelMap指的是同一个BindingAwareModelMap,@ModelAttribute标注的参数people,与存放在存放在Model中的是指向同一个.

ModelAttribute执行流程图

SpringMVC中将数据输出到页面的几种常用方式相关推荐

  1. matlab中将数据保存为txt文件_matlab中将数据输出保存为txt格式文件的方式

    将matlab中数据输出保存为txt 格式总结网上各大论坛,主要有三种 方法. 第一种方法 :save(最简单基本 具体的命令是:用save*.txt -ascii 为函数*.txt 为文件名,该文件 ...

  2. request转发,response重定向,异步请求json数据输出到页面

    request转发: //转发到index.jsp页面request.getRequestDispatcher("index.jsp").forward(request, resp ...

  3. 将数据渲染到页面的几种方式

    将数据渲染到页面的几种方式: 1.字符串拼接: 2.dom回流 3.文档碎片(文档碎片节点:documentFragment) 4.模板         (下章会详细介绍模板) 转载于:https:/ ...

  4. python 读写数据文件的6种常用方式

    本文主要介绍python读写数据文件的6种常用方式. 1. python内置方法 with open(r'test.xlsx') as f:a = f.read() 一般,在应用上述上下文管理器后,可 ...

  5. FME教程:表格数据分组统计总数的三种实现方式

    在FME中进行表格数据分组统计总数的三种方式,实现类似SQL中分组统计总数的功能. 一.业务场景 现在有图1所示的一份Excel表格数据,要求统计每个村的户数,如图2所示. 图1 Excel表格数据 ...

  6. matlab中将数据保存为txt文件_matlab中将数据输出保存为txt格式文件的方法

    将matlab中数据输出保存为txt或dat格式总结网上各大论坛,主要有三种方法. 第一种方法:save(最简单基本的) 具体的命令是:用save *.txt -ascii x x为变量 *.txt为 ...

  7. mybatis plus当月数据查询_mybatis plus的3种查询方式(小结)

    本文是基于springboot框架下的查询. 一:基本配置: 1.仓库依赖 alimaven aliyun maven http://maven.aliyun.com/nexus/content/gr ...

  8. SpringMVC请求后台地址URL没有.*的几种实现方式

    今天做项目,由于项目是通过扫二维码进入,二维码存放的地址不希望有 .do,而是http:xxxx:8080/xxx/yyy/zzz的格式(zzz为参数),但是项目其它请求url后面都必须要有.do,想 ...

  9. iOS 页面间几种传值方式(属性,代理,block,单例,通知)

    第二个视图控制器如何获取第一个视图控制器的部分信息 例如 :第二个界面中的lable显示第一个界面textField中的文本 这就需要用到属性传值.block传值 那么第一个视图控制器如何获的第二个视 ...

最新文章

  1. freebasic 编译linux,免费BASIC编译器下载
  2. 更改c语言程序保存地址吗,C语言文本文件实现局部修改
  3. PhpExcel 删除默认的Sheet
  4. RabbitMQ开机启动 Centos7环境
  5. linux shell if -a 到-z参数含义
  6. 1.SpringMVC 概述
  7. guava_学习_00_资源帖
  8. 某8位微型计算机地址码为18位,计算机组成原理复习题.doc
  9. Shell获取多行输入并输出每行的第3个字符
  10. jquery ajax select 二级联动
  11. Linux中tmux多终端复用和Screen多窗口工具
  12. Windows Vista SP2 和 Windows Server 2008 SP2 已经发布
  13. VCForPython27.msi下载
  14. Python安装pandas模块
  15. c++语言题库,计算机二级c++题库软件下载
  16. 东软始业教育2021(注意看得分88分)
  17. 行列式的定义及简单计算
  18. ESP8266/ESP32/nodeMcu/wemos D1 MINI开发板用TFT_eSPI库驱动ST7789(240*240)TFT显示屏
  19. 介绍NPOI 的颜色卡、名称以及索引
  20. pthread-win32库编译及使用方法注意事项

热门文章

  1. Centos7禁用THP(Transparent HugePages)
  2. 个人软件测试工程师前景理解
  3. 360奇安信和SonarQube漏洞及bug修改
  4. 怎样申请IMEI号?
  5. TexturePacker 导出 Egret(白鹭引擎)格式的图集和图片字体
  6. 六步骤确保企业成功选择CRM
  7. Qt中的控件随着窗口大小改变而改变和充满窗口
  8. xshell连接Linux鼠标焦点丢失了,Xshell5连接虚拟机中的Linux的方法以及失败原因解决...
  9. videojs动态封面_videojs动态更改视频路径
  10. 菜鸟修炼笔记--QT--【问题】界面切换时焦点各种异常的处理