Spring MVC中的模型数据处理
一、综述
Spring MVC 提供了以下途径来输出模型数据:
1、ModelAndView
当处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添加模型数据到请求域。
2、Map 及 Model
输入参数为org.springframework.ui.Model、org.springframework.ui.ModelMap 或 java.uti.Map 时,处理方法返回时,Map中的数据会自动添加到模型中。
3、@SessionAttributes
该注解将模型中的某个属性暂存到HttpSession 中,以便多个请求之间可以共享这个属性。
4、@ModelAttribute: 方法输入参数标注该注解后, 入参的对象就会放到数据模型中。
二、ModelAndView和Map&Model
ModelAndView对象中包含了一个model属性和一个view属性。
model:是一个ModelMap的类型。而ModelMap又是一个LinkedHashMap的子类。
view:包含了一些视图信息。
实现原理:
当视图解释器解析ModelAndVIew类型的参数时,其中model是一个Map的实现类的子类,视图解析器将model中的每个元素都通过request.setAttribute(name, value)方法,添加request请求域中。这样就可以在JSP页面中通过EL表达式来获取对应的值
操作方法:
添加模型数据:
MoelAndView addObject(String attributeName, Object attributeValue)
ModelAndView addAllObject(Map<String, ?> modelMap)
设置视图:
void setView(View view)
void setViewName(String viewName)
示例演示:
1、编写处理函数
//导入相应的包
@Controller
public class SpringMVCTest { public MAVTest() {
// TODO Auto-generated constructor stub
} @RequestMapping(value = "login")
public ModelAndView login() {//返回值为ModelAndView类型
System.out.println("login()....");
ModelAndView mav = new ModelAndView();
mav.setViewName("welcome");//设置相应的视图名称为welcome,
mav.addObject("msg", "hello Spring MVC");//直接存入参数值 // List
List<String> list = new ArrayList<String>();
list.add("java");
list.add("hadoop");
list.add("Mysql");
mav.addObject("bookList", list);//存入List类型的数据 // Map
Map<String, String> map = new HashMap<String, String>();
map.put("zhangsan", "北京");
map.put("lisi", "上海");
map.put("wangwu", "深圳");
mav.addObject("map", map);//存入Map型数据 return mav;//返回ModelAndView对象
} }
2、编写jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 输出普通字符 -->
${msg}
<br />
<!-- 输出List -->
<p>书籍列表</p>
<c:forEach items="${bookList}" var="node">
<c:out value="${node}"></c:out>
</c:forEach>
<br />
<br /> <!-- 输出Map -->
<c:forEach items="${map}" var="node">
姓名:<c:out value="${node.key}"></c:out>
住址:<c:out value="${node.value}"></c:out>
<br />
</c:forEach>
</body>
</html>
这样,当我们请求连接为“login”时,我们将转到welcome.jsp页面,并显示我们在ModelAndView中存放的数据。
二、@SessionAttributes
如果我们希望在多个请求之间共用某个模型属性数据,则可以在控制器类上标注一个 @SessionAttributes, Spring MVC 将把模型中对应的属性暂存到 HttpSession 中。
使用方法:
@SessionAttributes(value={"xxx"}, types={xxxx.class})
@SessionAttributes 除了可以通过属性名来指定放到会话中的属性外,还可以通过模型属性的对象类型指定哪些模型属性被放到会话中。
使用举例:
@SessionAttributes(types=User.class)
这个注解表示将隐含模型中所有类型为 User.class 的属性添加到会话中。
@SessionAttributes(value={“user1”, “user2”}) 、
添加两个属性
@SessionAttributes(types={User.class, Dept.class})
添加所有User.class和Dept.class类型的属性
@SessionAttributes(value={“user1”, “user2”},types={Dept.class})
添加两个属性,并添加所有Dept.class类型的属性。
注意: 该注解只能放在类的上面. 而不能修饰放方法。
使用示例:
1、编写处理函数
@SessionAttributes(value={"user"}, types={String.class})
//该注解把名为user的属性放到了会话中,并把所有String类型的属性放到会话中。
@Controller
public class SpringMVCTest {
@RequestMapping("/testSessionAttributes")
public String testSessionAttributes(Map<String, Object> map){
//假设已经定义了一个User,有姓名,密码,邮箱和年龄四个属性。
User user = new User("kang", "123456", "kang@qq.com", 24);
map.put("user", user);
map.put("school", "CETC");
return SUCCESS;
}
}
2、编写jsp页面
这里不做描述,原理十分简单。
三@ModelAttribute
使用方式:
1、在方法定义上使用 @ModelAttribute 注解,那么Spring MVC在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute 的方法。
2、在方法的入参前使用 @ModelAttribute 注解,那么Spring MVC可以从隐含对象中获取到隐含的模型数据,并从中获取对象,再将请求参数绑定到对象中,再传入入参。从而将方法入参对象添加到模型中。
使用示例:
@Controller
public class SpringMVCTest {
@ModelAttribute
public void getUser(@RequestParam(value="id",required=false) Integer id,
Map<String, Object> map){
System.out.println("modelAttribute method");
if(id != null){
//模拟从数据库中获取对象
User user = new User(1, "kang", "123456", "kang@qq.com", 24);
System.out.println("从数据库中获取一个对象: " + user); map.put("user", user);
}
}
@RequestMapping("/testModelAttribute")
public String testModelAttribute(User user){
System.out.println("修改: " + user);
return SUCCESS;
}
}
3、运行流程
1)执行 @ModelAttribute 注解修饰的方法: 从数据库中取出对象, 把对象放入到了 Map 中。键为: user。
2) SpringMVC 从 Map 中取出 User 对象, 并把表单的请求参数赋给该 User 对象的对应属性。
3). SpringMVC 把上述对象传入目标方法的参数.
注意:在 @ModelAttribute 修饰的方法时, 放入到 Map 时的键(user)需要和目标方法入参类型(User)的第一个字母小写的字符串一致!
4、SpringMVC 确定目标方法 POJO 类型入参的过程
-----------如何确定一个 key---------
1). 若目标方法的 POJO 类型的参数没有使用 @ModelAttribute 作为修饰, 则 key 为 POJO 类名第一个字母的小写。
2). 若使用了 @ModelAttribute 来修饰, 则 key 为 @ModelAttribute 注解的 value 属性值。
-----------在 implicitModel 中查找 key 对应的对象-----------
1)若存在, 则作为入参传入目标方法。
2)若在 @ModelAttribute 标记的方法中在 Map 中保存过, 且 key 和 1 确定的 key 一致, 则会获取到。
3)若 implicitModel 中不存在 key 对应的对象, 则检查当前的 Handler 是否使用 @SessionAttributes 注解修饰。
---若使用了该注解, 且 @SessionAttributes 注解的 value 属性值中包含了 key, 则会从 HttpSession 中来获取 key 所对应的 value 值。若存在则直接传入到目标方法的入参中,若不存在则将抛出异常。
---若 Handler 没有标识 @SessionAttributes 注解或 @SessionAttributes 注解的 value 值中不包含 key, 则会通过反射来创建 POJO 类型的参数, 传入为目标方法的参数。
最后SpringMVC 会把 key 和 POJO 类型的对象保存到 implicitModel 中, 进而会保存到 request 中。
Spring MVC中的模型数据处理的更多相关文章
- Spring MVC系列之模型绑定(SpringBoot)(七)
前言 上一节我们在SpringBoot中启用了Spring MVC最终输出了HelloWorld,本节我们来讲讲Spring MVC中的模型绑定,这个名称来源于.NET或.NET Core,不知是否恰 ...
- Spring MVC 中的基于注解的 Controller【转】
原文地址:http://my.oschina.net/abian/blog/128028 终于来到了基于注解的 Spring MVC 了.之前我们所讲到的 handler,需要根据 url 并通过 H ...
- Spring MVC中基于注解的 Controller
终于来到了基于注解的 Spring MVC 了.之前我们所讲到的 handler,需要根据 url 并通过 HandlerMapping 来映射出相应的 handler 并调用相应的方法以响 ...
- spring mvc中的拦截器小结 .
在spring mvc中,拦截器其实比较简单了,下面简单小结并demo下. preHandle:预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器(如我们上一章的Control ...
- Spring MVC 中 @ModelAttribute 注解的妙用
Spring MVC 中 @ModelAttribute 注解的妙用 Spring MVC 提供的这种基于注释的编程模型,极大的简化了 web 应用的开发.其中 @Controller 和 @Rest ...
- spring mvc中DispatcherServlet如何得到ModelAndView的
首先看下面这种张图,这张图说明了spring mvc整体的流程. 本文讲的就是如何从DispatcherServlet中得到ModerAndView的过程. 首先看DispatherServlet这个 ...
- spring mvc(4)处理模型数据
处理模型数据 Spring MVC 提供了以下几种途径输出模型数据: – ModelAndView: 处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添加 模型数据 – Map ...
- Spring MVC 中的基于注解的 Controller(转载)
终于来到了基于注解的 Spring MVC 了.之前我们所讲到的 handler,需要根据 url 并通过 HandlerMapping 来映射出相应的 handler 并调用相应的方法 ...
- Spring mvc中@RequestMapping 6个基本用法
Spring mvc中@RequestMapping 6个基本用法 spring mvc中的@RequestMapping的用法. 1)最基本的,方法级别上应用,例如: Java代码 @Reques ...
随机推荐
- nginx静态资源配置
解决EE工程中静态文件显示问题 在工程中本地测试没有问题,发现使用nginx配置了路径的页面,会获取不到相应页面的静态文件问题 静态文件的路径类似为: http://localhost:8080/sa ...
- Linux&Windows下批量修改文件后缀
Linux下从给定文件夹中找出小于1M的文件,并批量添加.gif后缀 先看一下文件夹下的目录的格式 ll -Sh -rw-rw-r-- 1 yangkun yangkun 17M May 10 15: ...
- How does a single thread handle asynchronous code in JavaScript?
原文:https://www.quora.com/How-does-a-single-thread-handle-asynchronous-code-in-JavaScript ----------- ...
- mac os x+paralles使用source insight
将Mac OS X下的目录共享到Paralles后,source insight创建工程.但是当再次打开时却打开失败.提示:there was an error opening project 网上对 ...
- 正则表达式---A bytes of python
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. 给定一个正则表达式和另一个 ...
- css 背景 平移 动画
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- 禁止右键,Ctrl+A,Ctrl+C,Ctrl+V来禁止复制内容,IE网页另存可禁止,但对火狐浏览器没有用的
禁止右键,Ctrl+A,Ctrl+C,Ctrl+V来禁止复制内容,IE网页另存可禁止,但对火狐浏览器没有用的. 代码如下:(开发了左键选择,方便阅读)<!DOCTYPE HTML PUBLIC ...
- ABP框架EF6链接Oracle数据库手动迁移
环境:VS2017 + ABP官方模板(不含Zero) +Oracle 11Gx64DB + Oracle 11Gx32Client(PLSQL工具访问) 一.Abp项目的下载以及运行 1.创建ab ...
- ASP.NET基本对象介绍
ASP.NET能够成为一个庞大的软件体系,与它提供了大量的对象类库有很大的关系.这些类库中包含许多封装好的内置对象,开发人员可以直接使用这些对象的方法和属性,因此用较少的代码量就能轻松完成很多对象. ...
- asp.net core mvc视频A:笔记2-3.高级数据绑定
默认的绑定顺序,如果需要取指定数据源里的数据,需要通过属性控制,比如[FromQuery] 前端 控制器方法 前端 此时并不能得到head中的数据 改造控制器方法,添加[FromHeader]属性 再 ...