处理模型数据

Spring MVC 提供了以下几种途径输出模型数据:

  • ModelAndView: 处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添加模型数据
  • Map 及 Model: 入参为org.springframework.ui.Model、org.springframework.ui.ModelMap 或 java.uti.Map 时,处理方法返回时,Map 中的数据会自动添加到模型中。
  • @SessionAttributes: 将模型中的某个属性暂存到HttpSession 中,以便多个请求之间可以共享这个属性
  • @ModelAttribute: 方法入参标注该注解后, 入参的对象就会放到数据模型中

ModelAndView

  • 控制器处理方法的返回值如果为 ModelAndView,则其既包含视图信息,也包含模型数据信息。
  • 添加模型数据:
    • MoelAndView addObject(String attributeName, Object attributeValue)
    • ModelAndView addAllObject(Map<String, ?> modelMap)
  • 设置视图:
    • void setView(View view)
    • void setViewName(String viewName)

Map 及 Model

  • Spring MVC 在内部使用了一个 org.springframework.ui.Model 接口存储模型数据

  • 具体步骤

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

Map 及 Model 示例

@ModelAttribute("user")
public User getUser() {
User user = new User();
user.setAge(10);
return user;
}
@RequestMapping("/handle20")
public String handle20(Map<String,Object> map) {
map.put("time",new Date());
User user = (User) map.get("user");
user.setEmail("qwer@163.com");
return "success";
}
email:${requestScope.user.email}
<br><br>
time:${requestScope.time}

@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})

@SessionAttributes 示例

@SessionAttributes("user")
@Controller
@RequestMapping("/hello")
public class HelloWorld {
@ModelAttribute("user")
public User getUser() {
User user = new User();
user.setAge(10);
return user;
}
}
@RequestMapping("/handle21")
public String hanle21(@ModelAttribute("user") User user) {
user.setAge(22);
return "redirect:/hello/handle22.action"
}
@RequestMapping("/handle22")
public String handle22(Map<String,Object> map,SessionStatus sessionStatus) {
User user = (User) map.get("user");
user.setId(200);
return "success";
}

@ModelAttribute

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



@modelattrbute默认

bean 在请求域里面的属性名是类名的第一个字母小写

由@SessionAttributes引发的异常

org.springframework.web.HttpSessionRequiredException:

Session attribute 'user' required - not found in session

如果在处理类定义处标注了@SessionAttributes(“xxx”),则尝试从会话中获取该属性,并将其赋给该入参,然后再用请求消息填充该入参对象。如果在会话中找不到对应的属性,则抛出 HttpSessionRequiredException 异常

如何避免@SessionAttributes引发的异常

使用@ModelAttribute("user")

该方法会往隐含模型中添加一个名为user的模型属性

@Controller
@RequestMapping("/user")
@SessionAttributes("user")
public class UserController {
//该方法会往隐含模型中添加一个名为user的模型属性
@ModelAttribute("user")
public User getUser() {
User user = new User();
return user;
} @RequestMapping(value = "/handle71")
public String handle71(@ModelAttribute(“user”) User user) {
//...
} @RequestMapping(value = "/handle72")
public String handle72(ModelMap modelMap,SessionStatus sessionStatus) {
//...
}
}

补充

map model modelmap

这三个成为入参时mvc会自动将他们放入modelandview中

18

model attributes注解

如果使用model 可以忽略

控制器中的方法的参数是被springmvc以反射的方式创建的 然后赋值,而不是直接赋值

而且参数会放在请求域中,且键值对中的键是默认为类型的第一个字母小写,或者@model attribute注解中的值,键值对中的值就是参数对象

【SpringMVC】处理模型数据的更多相关文章

  1. SpringMvc处理模型数据(也就是从数据库中查询出来的数据放到请求域中)

    这讲的是从数据库中查询到的数据,存放到请求域中.然后页面上直接可以从请求域中获取值. 有4种方式: 1):ModelAndView   是作为一个对象. /** * 目标方法的返回值可以是 Model ...

  2. SpringMVC处理模型数据

    目录结构 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi= ...

  3. springmvc学习(五)——处理模型数据

    Spring MVC 提供了以下几种途径输出模型数据: ModelAndView: 处理方法返回值类型为 ModelAndView 时, 方法体即可通过该对象添加模型数据Map 及 Model: 入参 ...

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

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

  5. Spring MVC 处理模型数据

    SpringMVC 处理模型数据: 1 controller接收pojo: <form action="save" method="get"> &l ...

  6. SpringMvc:处理模型数据

    SpringMvc提供了以下途径输出模型数据: -ModelAndView:处理方法返回值类型为ModelAndView,方法体即可通过该对象添加模型数据 -Map或Model:入参为org.spri ...

  7. springMVC(6)---处理模型数据

    springMVC(6)---处理模型数据 之前一篇博客,写个怎么获取前段数据:springMVC(2)---获取前段数据,这篇文章写怎么从后端往前端传入数据. 模型数据类型             ...

  8. SpringMVC(十二):SpringMVC 处理输出模型数据之@ModelAttribute

    Spring MVC提供了以下几种途径输出模型数据:1)ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据:2)Map及Model:处理方法入参 ...

  9. SpringMVC(九):SpringMVC 处理输出模型数据之ModelAndView

    Spring MVC提供了以下几种途径输出模型数据: 1)ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据: 2)Map及Model:处理方法 ...

  10. SpringMVC(十五) RequestMapping map模型数据

    控制器中使用map模型数据,传送数据给视图. 控制器参考代码: package com.tiekui.springmvc.handlers; import java.util.Arrays; impo ...

随机推荐

  1. .NetCore依赖注入(DI)之生命周期

    在 .NET Core 中,依赖注入(Dependency Injection,DI)是一种实现控制反转(Inversion of Control,IoC)的技术,它通过将依赖对象注入到需要它们的对象 ...

  2. 用于决策的世界模型 -- 论文 World Models (2018) & PlaNet (2019) 讲解

    参考资料: [2411.14499] Understanding World or Predicting Future? A Comprehensive Survey of World Models ...

  3. Netty与NIO服务器-NIO中的零拷贝

    1.什么是零拷贝 一种避免 CPU 将数据从一块存储拷贝到另外一块存储的技术.针对操作系统中的设备驱动程序.文件系统以及网络协议堆栈而出现的各种零拷贝技术极大地提升了特定应用程序的性能,并且使得这些应 ...

  4. MacBook配置

    如何在Mac上安装Java JDK及配置环境变量 1. 访问Java JDK 网站下载与安装(以JDK8为例) 点击下载链接:https://www.oracle.com/java/technolog ...

  5. java设计模式---总则

    设计模式总则 一.概述 1.什么是设计模式 设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 解释下: 分类编目:就是说可以找到一些特征去划分这些设计模式,从而进行分类. ...

  6. dart安装教程详解

    官网 https://dart.dev 关于发布通道和版本字符串 Dart SDK有三个发布通道: 1==>:稳定释放,大约每三个月更新一次: 稳定释放适合生产使用. 2==>:预览发布, ...

  7. Q:查看服务器内存和cpu占用排名

    pid 表示进程 ID,cmd 表示进程命令行,%mem 表示进程占用内存百分比,%cpu 表示进程占用 CPU 百分比,--sort=-%mem 表示按照内存占用率从高到低排序. 1.内存占比排序 ...

  8. Handbook of Enumerative Combinatorics 阅读

    Chapter 1 代数几何方法 Part1 代数方法 1.3 生成函数 符号化方法和拉格朗日反演 拆分数的生成函数和五边形数定理.斐波那契的拆分数 平面二叉树(Plane Binary Tree). ...

  9. Iceberg治理服务Amoro---配置Prometheus + Grafana看板

    一.基础资料 1.mac安装Prometheus + Grafana https://www.cnblogs.com/robots2/p/18689540 2.配置文档 https://amoro.a ...

  10. vue-element-template去除登录

    一.修改src目录下的permission.js文件 1.注释 //if (hasToken) { // if (to.path === '/login') { // // if is logged ...