package com.wh.handler;
/**
* @ModelAttribute绑定请求参数到命令对象
* @ModelAttribute一个具有如下三个作用:
*
* ①绑定请求参数到命令对象:放在功能处理方法的入参上时,用于将多个请求参数绑定到一个命令对象,
* 从而简化绑定流程,而且自动暴露为模型数据用于视图页面展示时使用;
*
* ②暴露表单引用对象为模型数据:放在处理器的一般方法(非功能处理方法)上时,是为表单准备要展示的表单引用对象,
* 如注册时需要选择的所在城市等,而且在执行功能处理方法(@RequestMapping注解的方法)之前,
* 自动添加到模型对象中,用于视图页面展示时使用;
*
* ③暴露@RequestMapping方法返回值为模型数据:放在功能处理方法的返回值上时,
* 是暴露功能处理方法的返回值为模型数据,用于视图页面展示时使用。
*/
import java.util.Arrays;
import java.util.List; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody; @Controller
public class TestModelAttribute { //一、绑定请求参数到命令对象
/**
* @ModelAttribute("u") User user
* 相当与Model model; model.addAttribute("u",user);
* 即:将user这个对象添加到Model里去,在前台是通过${u.uname}等方式来获取这个值
* 类似与:将一个页面的值,又传到另一个页面中去
*
* @ModelAttribute User user
* 表示前台应通过${user.uname}等方式来获取
*/
@RequestMapping("/m1.action")
public String m1(@ModelAttribute User user){
System.out.println("u:"+user);
return "sus.jsp";
} /**
* 对象图导航式的绑定 workInfo.city=bj
*
* 绑定请求参数到命令对象支持对象图导航式的绑定,如请求参数包含
* “?username=zhang&password=123&workInfo.city=bj”
* 自动绑定到user中的workInfo属性的city属性中。
*/
@RequestMapping(value="/m2.action")
public String test2(@ModelAttribute("user") User user) {
System.out.println("u:"+user);
return "sus.jsp";
} //二、暴露表单引用对象为模型数据
/**
* @ModelAttribute("clist")
* public List cityList(){}
* 表示将cityList方法的返回值添加到model里去,且Model的变量名为clist
*
* 注意:
* 1、代码会在执行功能处理方法之前执行,并将其自动添加到模型对象中,
* 即必须执行其他的功能方法,此处的方法才会在功能方法之前执行,不然,此处的方法不会执行
* 2、在功能处理方法中调用Model 入参的containsAttribute("cityList")将会返回true。
*/
@ModelAttribute("clist")
public List cityList(){
return (List) Arrays.asList("北京","上海","安徽");
} @RequestMapping("/m3.action")
public String demo(Model model){
//System.out.println(model.containsAttribute("clist"));
return "sus.jsp";
} //-----------------------------
/**
* 如你要修改用户资料时一般需要根据用户的编号/用户名查找用户来进行编辑,此时可以通过如下代码查找要编辑的用户。
* 也可以进行一些默认值的处理。
*
* 注意:因为@ModelAttribute注解方法会在功能方法之前执行,所以,可以在注解方法里进行一些查询操作。
* 即功能方法都不用去数据库查询,可以让@ModelAttribute注解方法进行代劳,通过
* @RequestParam(value="username", defaultValue="")先将要查询的相关信息获取;
* 然后,功能方法只需要指定跳转到哪个页面即可
*/
@ModelAttribute("user") //①
public User getUser(@RequestParam(value="username", defaultValue="") String username) {
//TODO 去数据库根据用户名查找用户对象
User user = new User();
user.setUname("zhang");
return user;
} @RequestMapping(value="/m4") //②
public String test1(@ModelAttribute("user") User user, Model model){
return "";}
/**
*此处我们看到①和②有同名的命令对象,那Spring Web MVC内部如何处理的呢:
*(1、首先执行@ModelAttribute注解的方法,准备视图展示时所需要的模型数据;
*@ModelAttribute注解方法形式参数规则和@RequestMapping规则一样,如可以有@RequestParam等; *(2、执行@RequestMapping注解方法,进行模型绑定时首先查找模型数据中是否含有同名对象,如果有直接使用,
*如果没有通过反射创建一个,因此②处的user将使用①处返回的命令对象。即②处的user等于①处的user。
*/ //三、暴露@RequestMapping方法返回值为模型数据
/*
*<h1>m5.jsp</h1>
*<div>
* 姓名:${user2.uname}<br/>
* 年龄:${user2.uage}<br/>
* 性别:${user2.usex}<br/>
*</div>
*/
@RequestMapping("m5.jsp.action")
public @ModelAttribute("user2") User test3(@ModelAttribute("user2") User user) {
return new User("张三",20,"男");
}
/**
*大家可以看到返回值类型是命令对象类型,而且通过@ModelAttribute("user2")注解,
*此时会暴露返回值到模型数据(名字为user2)中供视图展示使用。那哪个视图应该展示呢?
*此时Spring Web MVC会根据RequestToViewNameTranslator进行逻辑视图名的翻译,详见【4.15.5、RequestToViewNameTranslator】一节。 *此时又有问题了,@RequestMapping注解方法的入参user暴露到模型数据中的名字也是user2,其实我们能猜到:
*(3、@ModelAttribute注解的返回值会覆盖@RequestMapping注解方法中的@ModelAttribute注解的同名命令对象。
*/ //四、匿名绑定命令参数
/*
public String test4(@ModelAttribute UserModel user, Model model)

public String test5(UserModel user, Model model) 此时我们没有为命令对象提供暴露到模型数据中的名字,此时的名字是什么呢?
Spring Web MVC自动将简单类名(首字母小写)作为名字暴露,
如“cn.javass.chapter6.model.UserModel”暴露的名字为“userModel”。 public @ModelAttribute List<String> test6()

public @ModelAttribute List<UserModel> test7() 对于集合类型(Collection接口的实现者们,包括数组),生成的模型对象属性名为
“简单类名(首字母小写)”+“List”,如List<String>生成的模型对象属性名为“stringList”,
List<UserModel>生成的模型对象属性名为“userModelList”。 其他情况一律都是使用简单类名(首字母小写)作为模型对象属性名,如Map<String, UserModel>类型的模型对象属性名为“map”。
*/ }

  

数据传递-------@ModelAttribute的更多相关文章

  1. Spring MVC 处理模型数据(@ModelAttribute)

    SpringMVC中的模型数据是非常重要的,因为MVC中的控制(C)请求处理业务逻辑来生成数据模型(M),而视图(V)就是为了渲染数据模型的数据. 直白来讲,上面这句话的意思就是:当有一个查询的请求, ...

  2. 《Java从入门到放弃》入门篇:springMVC数据传递

    springMVC中的数据传递方式与JSP和Struts2相比,更加的简单.具体有什么样的区别呢?我们通过下面这张图来对比就知道了. 随手画的,有些错别字,不用太在意..... 接下来,进入正题,sp ...

  3. EXTJS中grid的数据特殊显示,不同窗口的数据传递

    //EXTJS中grid的数据特殊显示renderer : function(value, metaData, record, rowIndex, colIndex, store, view) { v ...

  4. Activity系列讲解---数据传递

    在Android中,不同的Activity实例可能运行在一个进程中,也可能运行在不同的进程中.因此需要一种特别的机制帮助我们在Activity之间传递消息.Android中通过Intent对象来表示一 ...

  5. vue2.0 组件之间的数据传递

    组件间的数据传递// 父组件<template><div class="order"><dialog-addpro v-on:closedialog= ...

  6. ASP.NET MVC3中Controller与View之间的数据传递总结

    一.  Controller向View传递数据 1.       使用ViewData传递数据 我们在Controller中定义如下: ViewData["Message_ViewData& ...

  7. ASP.NET MVC3中Controller与View之间的数据传递

    在ASP.NET MVC中,经常会在Controller与View之间传递数据,因此,熟练.灵活的掌握这两层之间的数据传递方法就非常重要.本文从两个方面进行探讨: 一.  Controller向Vie ...

  8. 七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递

    通过第一天的学习之后,我们相信您已经对MVC有一些基本了解. 本节所讲的内容是在上节的基础之上,因此需要确保您是否掌握了上一节的内容.本章的目标是在今天学习结束时利用最佳实践解决方案创建一个小型的MV ...

  9. MVC数据传递

    一.数据传递 1.ViewData[]: 用法:action中:ViewData["key"]="aaa";,V层接收ViewData["key&qu ...

随机推荐

  1. Jmeter执行java脚本结束时提示:The JVM should have exited but did not.

    使用jmeter对dubbo进行压测时,需要使用jmeter的sampler里的java请求 使用./jmeter.sh -n -t test.jmx -l test.jmx -o -e test后台 ...

  2. Android多线程研究(3)——线程同步和相互排斥及死锁

    为什么会有线程同步的概念呢?为什么要同步?什么是线程同步?先看一段代码: package com.maso.test; public class ThreadTest2 implements Runn ...

  3. java 数据结构. 源代码阅读

    Collections工具类里的 Collections.synchronizedList public static <T> List<T> synchronizedList ...

  4. 排列组合(permutation)系列解题报告

    本文解说4道关于permutation的题目: 1. Permutation:输出permutation--基础递归 2. Permutation Sequence: 输出字典序排列的第k个permu ...

  5. Angular Scope解析与应用

    Scope层级结构 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA== ...

  6. opencl+opencv实现sobel算法

    这几天在看opencl编程指南.照着书中的样例实现了sobel算法: 1.结合opencv读取图像,保存到缓冲区中. 2.编写和编译内核.并保存显示处理后的结果. 内核: const sampler_ ...

  7. Android系统优化

    这些事实上就是优化rom 的一些实用小技巧. 认为非常多还是实用的. Build.prop (编辑 /system/build.prop 文件(须要root, 能够用文件管理器或者其它root exp ...

  8. [办公自动化]如何将PPT转为PDF,免费

    同事需要把PPT格式的文档转为PDF.她没有安装adobe acrobat,安装了微软office 2007. 这个其实可以通过安装微软官方插件来解决.无需额外费用. 所需软件为: 2007 Micr ...

  9. cp和scp

    1 两个命令的格式一样 cp src dst scp src dst 将src文件拷贝到dst目的地.cp是本机拷贝,即从本机的一个地方拷贝到另外一个地方. 而scp是拷贝到远程及其还是从远程机器拷贝 ...

  10. Linux服务器 /var/spool/clientmqueue 目录下产生大量文件的删除办法

    检查linux发现server中的磁盘分区空间超过98%,登录到服务器查看 [root@localhost etc]# df -hFilesystem 容量 已用 可用 已用% 挂载点/dev/hda ...