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

– ModelAndView: 处理方法返回值类型为 ModelAndView时, 方法体就可以通过该对象加入模型数据

– Map及Model:入參为org.springframework.ui.Model、org.springframework.ui.ModelMap 或 java.uti.Map 时,处理方法返回时,Map中的数据会自己主动加入到模型中。

– @SessionAttributes: 将模型中的某个属性暂存到HttpSession 中,以便多个请求之间能够共享这个属性

– @ModelAttribute: 方法入參标注该注解后, 入參的对象就会放到数据模型中

1.1. ModelAndView

控制器处理方法的返回值假设为 ModelAndView, 则其既包括视图信息,也包括模型数据信息。

• 加入模型数据:

– ModelAndView addObject(String attributeName, Object attributeValue)

– ModelAndView addAllObject(Map<String, ?

> modelMap)

• 设置视图:

– void setView(View view)

– void setViewName(String viewName)

JAVA:

/**
* SpringMVC 使用 ModelAndView 来解析视图和数据
* 假设返回的是字符串 运行方法后 还是会包装成一个 ModelAndView
* 最后会遍历 ModelMap将键值对存入request中
* @return
*/
@RequestMapping("/modelAndView")
public ModelAndView modelAndView(){
ModelAndView mv = new ModelAndView();
mv.addObject("name", "bigsea");
mv.addObject("age", 23);
mv.setViewName("helloworld");
return mv;
}

JSP:

<a href="modelAndView">modelAndView</a>
<br>
name : ${name} <br>
age : ${age} <br>
<br>

结果:

ModelAndView 主要有 view 和 model 属性

ModelMap 关系图

最后解析的时候会遍历 map 然后将键值对 存入 request 中

1.2. Map 和Model

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

• 详细步骤

– Spring MVC 在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器。

– 假设方法的入參为 Map 或 Model 类型,Spring MVC 会将隐含模型的引用传

递给这些入參。在方法体内,开发人员能够通过这个入參对象訪问到模型中的全部数

据。也能够向模型中加入新的属性数据

JAVA:

/**
* 当參数为Map时
* SpirngMVC 会传入 一个BindingAwareModelMap
* 往BindingAwareModelMap里面存入的值 会在后面存入request域中
* @param map
* @return
*/
@RequestMapping("/map")
public String map (Map<String, Object> map){
System.out.println(map.getClass().getName());
map.put("name", "bigsea");
map.put("age", 23);
return "helloworld";
}

JSP:

<a href="map">map</a>
name : ${name} <br>
age : ${age} <br>
<br>

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTY3NDc0NTA2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTY3NDc0NTA2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

将获取的结果存入開始new出来的ModelAndView 中,最后解析视图的时候,遍历插入request中,我们能够查看输出的map类型

org.springframework.validation.support.<span style="color:#ff0000;">BindingAwareModelMap</span>

1.3. @SessionAttributes

若希望在多个请求之间共用某个模型属性数据,则能够在控制器类上标注一个 @SessionAttributes,SpringMVC将在模型中相应的属性暂存到 HttpSession 中。

• @SessionAttributes 除了能够通过属性名指定须要放到会话中的属性外。还能够通过模型属性的对象类型指定哪些模型属性须要放到会话中

– @SessionAttributes(types=User.class) 会将隐含模型中全部类型为 User.class 的属性加入到会话中。

– @SessionAttributes(value={“user”,”admin”})

– @SessionAttributes(types={User.class, Department.class})

– @SessionAttributes(value={“user”,”admin”}, types={User.class})

/**
* 通过 @SessionAttributes 注解 在@SessionAttributes 中 设置 type 和 value
* type: 通过类型 来推断是否 将 属性存入 会话中
* value : 通过 ModelAndView 中 ModelMap 的 key 来推断 key 是否和 value 相等 假设相等 存入
* @return
*/
@RequestMapping("/sessionAttributes")
public ModelAndView sessionAttributes(){
User user = new User();
user.setName("bigsea");
user.setAge(23);
ModelAndView mv = new ModelAndView();
mv.setViewName("success");
mv.addObject("user", user);
return mv;
}

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTY3NDc0NTA2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTY3NDc0NTA2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTY3NDc0NTA2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

1.4. @ModelAttribute

在方法定义上使用 @ModelAttribute 注解:Spring MVC在调用目标处理方法前。会先逐个调用在方法级上标注了@ModelAttribute 的方法。

• 在方法的入參前使用 @ModelAttribute 注解:

– 能够从隐含对象中获取隐含的模型数据中获取对象,再将请求參数绑定到对象中,再传入入參

– 将方法入參对象加入到模型中

/**
* 当标注了@ModelAttribute
* SpirngMVC就会在调用目标方法前去运行该方法
* 将结果传入implicitMode中
* SpringMVC 中 大量的使用implicitMode
* @return
*/
@ModelAttribute("user")
public User modelAttribute(){
User user = new User();
user.setName("bigsea");
user.setAge(23);
return user;
}

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTY3NDc0NTA2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

1.1. HttpSessionRequiredException 异常

假设在处理类定义处标注了@SessionAttributes(“xxx”),则尝试从会话中获取该属性,并将其赋给该入參。然后再用请求消息填充该入參对象。

假设在会话中找不到相应的属性。则抛出 HttpSessionRequiredException 异常

@RequestMapping("/testSessionAttributesError")
public String testSessionAttributesError(User user){
System.out.println(user);
return "helloworld";
}
/**
* 当标注了@ModelAttribute
* SpirngMVC就会在调用目标方法前去运行该方法
* 将结果传入implicitMode中
* SpringMVC 中 大量的使用implicitMode
* @return
*/
@ModelAttribute("abc")
public User modelAttribute(){
User user = new User();
user.setName("bigsea");
user.setAge(23);
return user;
}

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTY3NDc0NTA2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

改为以下这样的方式:

	@RequestMapping("/testSessionAttributesError")
public String testSessionAttributesError(@ModelAttribute("abc")User user){
System.out.println(user);
return "helloworld";
}

SpringMVC 学习笔记(四) 处理模型数据的更多相关文章

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

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

  2. MYSQL初级学习笔记四:查询数据的操作DQL(SELECT基本形式)(26-35)

    知识点六:查询数据的操作DQL(SELECT基本形式)(26-35) CREATE DATABASE IF NOT EXISTS cms DEFAULT CHARACTER SET utf8; USE ...

  3. SpringMVC学习笔记(四)

    一.Controller接受网页参数. 1.使用方法的形参来接受 //使用基本类型和字符串来接受 @RequestMapping(value="/param2.do") publi ...

  4. SpringMVC学习笔记四:数据绑定

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6831344.html  参考:http://www.cnblogs.com/HD/p/4107674.html ...

  5. SQL学习笔记四之MySQL数据操作

    阅读目录 一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理 一 介绍 MySQL数据操作: DML =========== ...

  6. SpringMVC 学习笔记(四)

    41. 尚硅谷_佟刚_SpringMVC_返回JSON.avi SpringMVC中使用@ResponseBody注解标注业务方法,将业务方法的返回值做成json输出给页面 导包: 除了一些sprin ...

  7. SpringMVC学习笔记四:SimpleMappingExceptionResolver异常处理

    SpringMVC的异常处理,SimpleMappingExceptionResolver只能简单的处理异常 当发生异常的时候,根据发生的异常类型跳转到指定的页面来显示异常信息 ExceptionCo ...

  8. springmvc学习笔记(18)-json数据交互

    springmvc学习笔记(18)-json数据交互 标签: springmvc springmvc学习笔记18-json数据交互 springmvc进行json交互 环境准备 加入json转换的依赖 ...

  9. 史上最全的SpringMVC学习笔记

    SpringMVC学习笔记---- 一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于Spring ...

随机推荐

  1. Ubuntu16.04 on ThinkPad E455 不能识别耳机 的解决方法

    去年 (2016) 2月份在ThinkPad E455 上安装了Ubuntu 14.04 LTS (dual boot with Windows 10, upgraded to Ubuntu 16.0 ...

  2. Python GUI 之 Treeview 学习

    例子1 from tkinter import *import tkinter.ttk as ttk win = Tk()win.title("Treeview 学习") col ...

  3. 【二分+扫描线乱搞】B. Producing Snow

    注意二分写法... http://codeforces.com/problemset/problem/923/B #include<cstdio> #include<string.h ...

  4. 如何快速下载maven依赖jar包

    找到settings.xml文件.在mirrors里面添加下面的代码: <mirror> <id>alimaven</id> <mirrorOf>cen ...

  5. LA 3135 优先队列

    题目大意:有若干命令,它有两个属性Q_Num,Period(周期).按时间循序模拟前k个命令并输出他们的Q_Num,若同时发生输出Q_Num最小的值. #include<iostream> ...

  6. Linux下学习王爽老师的汇编语言

    坐起来非常容易,找到这条路确实非常曲折,为了后来的同志们不再纠结,特记录如下: 这几天看汇编语言时,很多人都推荐王爽老师的<汇编语言>,老师的书的确写的很好,但是讲的是ms的汇编,但是总不 ...

  7. Python入门--7--处理数据时学习到的东西

    一.数据导入(这里使用的是pands包) import pands as pd wenjian = pd.read_csv('路径') 二.数据变换 print wenjian.head()    # ...

  8. 在Fedora 22下安装配置RealVNC Server 5.2.3的经验总结

    RealVNC是目前功能最全.性能最好的VNC商业软件套件,很多时候为了确保性能和功能的统一,还是大量地在使用RealVNC.最近在Fedora 22工作站上安装RealVNC Server 5.2. ...

  9. codeforces Gym 101572 I 有向图最小环路径

    题目链接 http://codeforces.com/gym/101572 题意  一共n个文件  存在依赖关系 根据给出的依赖关系   判断是否存在循环依赖 ,不存在的话输出SHIP IT,存在的话 ...

  10. Debian9初始配置

    1 进入root用户 su root 2 修改镜像源:编辑/etc/apt/sources.list文件 nano /etc/apt/sources.list 修改内容如下: deb http://m ...