数据传递-------@ModelAttribute

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”。
	*/
	
}

  

转载于:https://www.cnblogs.com/1020182600HENG/p/6911523.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值