SpringMVC中的模型数据是非常重要的,因为MVC中的控制(C)请求处理业务逻辑来生成数据模型(M),而视图(V)就是为了渲染数据模型的数据。

直白来讲,上面这句话的意思就是:当有一个查询的请求,控制器(C)会把请求拦截下来,然后把根据请求的内容对它进行分配适合的处理方法,在处理方法上进行处理查询的业务逻辑,得到了数据,再把数据封装成数据模型对象,最后把数据模型(M)对象传给了视图(V),让视图去渲染数据模型。
 
-----以下内容来自《Spring3.0就这么简单》
我们知道SpringMVC通过@RequestMapping将请求引导到处理方法上,使用适合的方法签名(@RequestParam/@PathVariable等)将请求消息绑定到入参中(入参:方法的参数)。方法入参绑定请求消息只是处理方法第一步,还有更为重要的任务等待完成,即根据入参执行相应的逻辑,产生模型数据,导向到特定视图。
 
 
如何将模型数据输出给视图是SpringMVC框架的一项重要工作,SpringMVC提供了以下几种途径输出模型数据:
  • ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据。
  • @ModelAttribute:方法入参标注该注解后,入参的对象就会放到数据模型中。
  • Map及Model:入参为org.springframework.ui.Model、org.springframework.uiModelMap或java.util.Map时,处理方法返回时,Map中的数据会自动添加到模型中。
  • @SessionAttributes:将模型中的某个属性暂存到HttpSession中,以便多个请求之间可以共享这个属性。
 
在这里只讲解@ModelAttribute的使用和理解:
@ModelAttribute相当于是什么?
自己的理解:
        我觉得@ModelAttribute其实相当于我们自己手动操作封装对象的过程,比如说:在Servlet中,本来是要我们自己从request中获取请求参数,然后进行封装成对象,根据这个封装好的对象进行业务逻辑操作,最终从Dao层获取到返回的数据,我们再把这些数据封装成对象,返回给视图jsp。视图jsp就可以使用el表达式等方式直接调用。@ModelAttribute就是解决了我们自己手动操作封装对象、传递对象给视图的操作。
 
@ModelAttribute放置的位置不同也有不同的功能。那么@ModelAttribute可以放置在哪些位置呢?如下:
  • 可以在方法入参上使用@ModelAttribute注解
  • 还可以在方法定义中使用@ModelAttribute注解
  1. 放在方法入参上使用:
//UserController.java在方法入参处使用@ModelAttribute
@RequestMapping(value="/model")
public String handleModel(@ModelAttribute("user") User user){
user.setUserId("1000");
return "/user/createSuccess";
}
SpringMVC 将请求消息绑定到User对象中,然后再以“user”为键将User对象放到模型中。
在准备对视图进行渲染前,SpringMVC还会进一步将模型中的数据转储到视图的上下文中以暴露给视图对象。
对于JSP视图来说,SpringMVC会将模型数据转储到ServletRequest的属性列表中(即通过ServletRequest#setAttribute(String name,Object o )保存)。
handleModel()返回的逻辑视图名为 /user/createSuccess,对应createSuccess.jsp视图对象,这样createSuccess.jsp就可以使用${user.userName}等方式顺利访问到模型中的数据了。
 
   2.  在方法定义中使用@ModelAttribute注解:
除了可以在方法入参上使用@ModelAttribute注解,还可以在方法定义中使用@ModelAttribute注解。SpringMVC在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute的方法,并将这些方法的返回值添加到模型中。如下:
@ModelAttribute("user")
public User getUser(){ <---1//访问UserController中的任何一个请求处理方法前,
User user = new User(); //SpringMVC先执行该方法,并将返回值以user为键添加到模型中
user.setUserId("1001");
return user;
}
@RequestMapping(value="/model")
public String handleModel(@ModelAttribute("user") User user){ <---2 //在此,模型数据会赋给User的入参,
user.setUserName("tom"); //然后再根据HTTP请求消息进一步填充覆盖user对象
return "/user/showUser";
}
当访问UserController中的任何一个请求处理方法前,都会事先执行标注了@ModelAttribute的getUser()方法,并将其返回值以user为键添加到模型中。
由于 ② 处的handleModel()方法使用了入参级的@ModelAttribute注解,且属性名和 ① 处方法级@ModelAttribute的属性名相同。这时,SpringMVC会将 ① 处获取的模型属性先赋值给 ② 处的人参user,然后再根据HTTP请求消息对user进行填充覆盖,得到一个整合版本的user对象。
 
提示: 处理方法入参最多只能使用一个SpringMVC的注解,如 handleModel (@ModelAttribute("user") User user)的user入参使用了@ModelAttribute,就不能再使用@RequestParam或@CookieValue。如果使用了两个注解,SpringMVC就跑出异常。 
 
注:由于参考网上内容太多,忘记了出处...如有侵权请告知,Email: JamKong@126.com

SpringMVC中的模型数据是非常重要的,因为MVC中的控制(C)请求处理业务逻辑来生成数据模型(M),而视图(V)就是为了渲染数据模型的数据。

直白来讲,上面这句话的意思就是:当有一个查询的请求,控制器(C)会把请求拦截下来,然后把根据请求的内容对它进行分配适合的处理方法,在处理方法上进行处理查询的业务逻辑,得到了数据,再把数据封装成数据模型对象,最后把数据模型(M)对象传给了视图(V),让视图去渲染数据模型。
 
-----以下内容来自《Spring3.0就这么简单》
我们知道SpringMVC通过@RequestMapping将请求引导到处理方法上,使用适合的方法签名(@RequestParam/@PathVariable等)将请求消息绑定到入参中(入参:方法的参数)。方法入参绑定请求消息只是处理方法第一步,还有更为重要的任务等待完成,即根据入参执行相应的逻辑,产生模型数据,导向到特定视图。
 
 
如何将模型数据输出给视图是SpringMVC框架的一项重要工作,SpringMVC提供了以下几种途径输出模型数据:
  • ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据。
  • @ModelAttribute:方法入参标注该注解后,入参的对象就会放到数据模型中。
  • Map及Model:入参为org.springframework.ui.Model、org.springframework.uiModelMap或java.util.Map时,处理方法返回时,Map中的数据会自动添加到模型中。
  • @SessionAttributes:将模型中的某个属性暂存到HttpSession中,以便多个请求之间可以共享这个属性。
 
在这里只讲解@ModelAttribute的使用和理解:
@ModelAttribute相当于是什么?
自己的理解:
        我觉得@ModelAttribute其实相当于我们自己手动操作封装对象的过程,比如说:在Servlet中,本来是要我们自己从request中获取请求参数,然后进行封装成对象,根据这个封装好的对象进行业务逻辑操作,最终从Dao层获取到返回的数据,我们再把这些数据封装成对象,返回给视图jsp。视图jsp就可以使用el表达式等方式直接调用。@ModelAttribute就是解决了我们自己手动操作封装对象、传递对象给视图的操作。
 
@ModelAttribute放置的位置不同也有不同的功能。那么@ModelAttribute可以放置在哪些位置呢?如下:
  • 可以在方法入参上使用@ModelAttribute注解
  • 还可以在方法定义中使用@ModelAttribute注解
  1. 放在方法入参上使用:
//UserController.java在方法入参处使用@ModelAttribute
@RequestMapping(value="/model")
publicString handleModel(@ModelAttribute("user")User user){
user.setUserId("1000");
return"/user/createSuccess";
}
SpringMVC 将请求消息绑定到User对象中,然后再以“user”为键将User对象放到模型中。
在准备对视图进行渲染前,SpringMVC还会进一步将模型中的数据转储到视图的上下文中以暴露给视图对象。
对于JSP视图来说,SpringMVC会将模型数据转储到ServletRequest的属性列表中(即通过ServletRequest#setAttribute(String name,Object o )保存)。
handleModel()返回的逻辑视图名为 /user/createSuccess,对应createSuccess.jsp视图对象,这样createSuccess.jsp就可以使用${user.userName}等方式顺利访问到模型中的数据了。
 
   2.  在方法定义中使用@ModelAttribute注解:
除了可以在方法入参上使用@ModelAttribute注解,还可以在方法定义中使用@ModelAttribute注解。SpringMVC在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute的方法,并将这些方法的返回值添加到模型中。如下:
@ModelAttribute("user")
publicUser getUser(){ <---1//访问UserController中的任何一个请求处理方法前,
User user =newUser(); //SpringMVC先执行该方法,并将返回值以user为键添加到模型中
user.setUserId("1001");
return user;
}
 
@RequestMapping(value="/model")
publicString handleModel(@ModelAttribute("user")User user){ <---2 //在此,模型数据会赋给User的入参,
user.setUserName("tom"); //然后再根据HTTP请求消息进一步填充覆盖user对象
return"/user/showUser";
}
当访问UserController中的任何一个请求处理方法前,都会事先执行标注了@ModelAttribute的getUser()方法,并将其返回值以user为键添加到模型中。
由于 ② 处的handleModel()方法使用了入参级的@ModelAttribute注解,且属性名和 ① 处方法级@ModelAttribute的属性名相同。这时,SpringMVC会将 ① 处获取的模型属性先赋值给 ② 处的人参user,然后再根据HTTP请求消息对user进行填充覆盖,得到一个整合版本的user对象。
 
提示: 处理方法入参最多只能使用一个SpringMVC的注解,如 handleModel (@ModelAttribute("user") User user)的user入参使用了@ModelAttribute,就不能再使用@RequestParam或@CookieValue。如果使用了两个注解,SpringMVC就跑出异常。 

Spring MVC 处理模型数据(@ModelAttribute)的更多相关文章

  1. Spring MVC 处理模型数据

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

  2. ajax使用向Spring MVC发送JSON数据出现 org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported错误

    ajax使用向Spring MVC发送JSON数据时,后端Controller在接受JSON数据时报org.springframework.web.HttpMediaTypeNotSupportedE ...

  3. Spring MVC前后端数据交互总结

    控制器 作为控制器,大体的作用是作为V端的数据接收并且交给M层去处理,然后负责管理V的跳转.SpringMVC的作用不外乎就是如此,主要分为:接收表单或者请求的值,定义过滤器,跳转页面:其实就是ser ...

  4. Spring MVC返回json数据给Android端

    原先做Android项目时,服务端接口一直是别人写的,自己拿来调用一下,但下个项目,接口也要自己搞定了,我想用Spring MVC框架来提供接口,这两天便抽空浅学了一下该框架以及该框架如何返回json ...

  5. Spring MVC @InitBinder 数据绑定 & 数据格式化 & 数据校验

    1 数据绑定 2 数据格式化 修改绑定的字段等等操作 日期 - 接收表单日期字符串格式内容.,在实体类加入@DateTimeFormat 数值 原理: DefautFormattingConversi ...

  6. Spring MVC之JSON数据交互和RESTful的支持

    1.JSON概述 1.1 什么是JSON JSON(JavaScript Object Notation,JS对象标记)是一种轻量级的数据交换格式.它是基于JavaScript的一个子集,使用了C.C ...

  7. Spring MVC 返回json数据 报406错误 问题解决方案

    将jackson jar包改为jackson-databind-2.5.0.jar  jackson-core-2.5.0.jar  jackson-annotations-2.5.0.jar(这个版 ...

  8. Spring MVC生成JSON数据

    以下示例演示如何使用Spring Web MVC框架生成JSON数据格式.首先使用Eclipse IDE,并按照以下步骤使用Spring Web Framework开发基于动态表单的Web应用程序: ...

  9. spring mvc 返回json数据的四种方式

    一.返回ModelAndView,其中包含map集 /* * 返回ModelAndView类型的结果 * 检查用户名的合法性,如果用户已经存在,返回false,否则返回true(返回json数据,格式 ...

随机推荐

  1. 冒泡排序java代码

    冒泡排序就是依次取出最大数,然后依次交换放到数组最后边. 直观写法: public long[] sort(long[] a){ int n = a.length - 1; // Step:1 选出最 ...

  2. 深入理解PHP内核(二)概览-PHP生命周期与Zend引擎

    本文参考自<深入理解PHP内核>,地址:https://github.com/reeze/tipi 本文链接:http://www.orlion.ml/232/ 1.SAPI接口 SAPI ...

  3. 深入理解javascript作用域系列第三篇——声明提升(hoisting)

    × 目录 [1]变量 [2]函数 [3]优先 前面的话 一般认为,javascript代码在执行时是由上到下一行一行执行的.但实际上这并不完全正确,主要是因为声明提升的存在.本文是深入理解javasc ...

  4. Yii的学习(1)--安装配置

    之前在sina博客写过Yii的文章,来到博客园之后,没再写过关于Yii的文章,正好端午假期没啥事,就结合以前的博客,Yii的官方文档,再加上最近的关于Yii的收获总结一下,写个系列~~ Yii是一个基 ...

  5. Web 开发人员和设计师必读文章推荐【系列二十九】

    <Web 前端开发精华文章推荐>2014年第8期(总第29期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

  6. Windows Azure Active Directory (1) 前言 - 基于声明的验证和授权

    <Windows Azure Platform 系列文章目录> 在我们介绍整套系统架构之前,我们需要首先定义一些基本的概念. 用户及其属性: 用户值得是要使用某项服务的个体.用户一般都有一 ...

  7. java并发编程读书笔记(1)-- 对象的共享

    1. 一些原则 RIM(Remote Method Invocation):远程方法调用 Race Condition:竞态条件 Servlet要满足多个线程的调用,必须是线程安全的 远程对象,即通过 ...

  8. 【Swift学习】Swift编程之旅---集合类型之数组(六)

    swift提供了3种主要的集合类型,array,set,dictionary.本节介绍array. 数组是存储有序的相同类型的集合,相同的值可以多次出现在不同的位置. 注意: swift的Array类 ...

  9. 个人作业-Week2:案例分析

    截止时间:2016年9月25日24:00. 很多同学有误解,软件工程课是否就是理论课?或者是几个牛人拼命写代码,其他人打酱油的课?要不然就是学习一个程序语言,搞一个职业培训的课? 都不对, 软件工程有 ...

  10. C# 视频流操作

    发送视频流 void SendVideoBuffer(object bufferIn) { try { TcpClient tcp = ); NetworkStream ns = tcp.GetStr ...