17.@ModelAttribute 绑定请求参数到命令/表单对象

作用:可以将值存放到模型中,也可以从模型中取出

保存数据的级别:
	1.request  	request/model/map/modelmap
	2.session  	session
	3.application
@RequestMapping("/model_attribute")
@Controller
public class ModelAttributeController {
	//springmvc不仅可以帮助我们接收数据封装对象,并且还把封装好的对象放到模型中
	//放模型中的名字key为类型名字首字母小写 比如下面的User->key就为user
	//自定义对象User,,user=User [id=3, name=jack, age=20]
	//在request中以key=value的方式默认保留了很多的东西
	@RequestMapping("/test1")
	public String test1(User u) {
		System.out.println("ModelAttributeController test1()...");
		System.out.println("u="+u);
		return "test";
	}
	/*
	 * ../model_attribute/test1?id=4&name=jack&age=20
	 * u=User [id=4, name=jack, age=20]
	 * */

test.jsp

<body>
	<h1>JSP的test</h1>
	<h1>${name }</h1>
	<br><br><br><br><br>
	<%
		java.util.Enumeration<String> enumeration=request.getAttributeNames();
		while(enumeration.hasMoreElements()){
			String key=enumeration.nextElement();
			Object value= request.getAttribute(key);
			out.println(key+"="+value+"<br>");
		}
	%>
	<br><br><br>
	${user }<br>
	${user.id }<br>
	${user.name }<br>
	${user.age }<br>
	
</body>

在这里插入图片描述
结论:

springmvc不仅可以帮助我们接收数据封装对象,并且还把封装好的对象放到模型中
放模型中的名字key为类型名字首字母小写 比如上面的User->key就为user
自定义对象User,,user=User [id=3, name=jack, age=20]
在request中以key=value的方式默认保留了很多的东西
@RequestMapping("/test2")
public String test2(String name) {
	System.out.println("ModelAttributeController test2()...");
	System.out.println("name="+name);
	return "test";
}

在这里插入图片描述

结论:基本数据类型或者String类型的参数,不会自动放到模型中
/*
测试发现基本类型和String类型的参数默认在模型中保存的方式不是直接拿变量的名字当成key,所以用变量去取值获取不到
javax.servlet.forward.query_string=name=tom
不是直接拿user当成key值,而是经过系统的一些设置当成key值,
${javax.servlet.forward.query_string}就能取出值
*/
//@PathVariable注解可以把数据放到模型中
//模型存放的名字就是变量名或者指定的名字 ,usernamename=jack
@RequestMapping("/test3/{username}")
public String test3(@PathVariable("username") String name) {
	System.out.println("ModelAttributeController test3()...");
	System.out.println("name="+name);
	return "test";
}

在这里插入图片描述
///@ModelAttribute //

作用1.绑定请求参数到表单对象,同时将对象存放到模型中(可以指定存放的名字)

//@ModelAttribute接收客户端数据
//并且把值存到模型中,同时指定key的名字
//万一参数是List<User> map<user>,由于不是变量名为key,可能更复杂
@RequestMapping("/test4")
//@ModelAttribute指明存储到model中的key值叫什么
public String test4(@ModelAttribute("name") String name) {  
	//默认key值不是name而是String,但是希望存储的key值叫name 
	System.out.println("ModelAttributeController test4()...");
	System.out.println("name="+name);
	return "test";
}

在这里插入图片描述
等价于

//test6与test5是不同的两种方式,
//test6是参数方式Model model,而test5是注解的方式@ModelAttribute("u")
@RequestMapping("/test6")
public String test6(User u,Model model) { 
	System.out.println("ModelAttributeController test6()...");
	System.out.println("u="+u);
	model.addAttribute("u", u);
	return "test";
}

在spring中的xml中配置的bean对象都会在内存中存在,直接使用即可。
在springmvc中参数会自动初始化对象以及将数据保存,如果没有数据则只会初始化一个没有内容的对象

作用2.在功能处理方法执行前,向模型中添加数据

//在controller中的功能处理方法执行之前,但是加上@ModelAttribute("user"),
//springmvc会自动执行该方法,并将返回值放到模型中,名字为指定名称
@ModelAttribute("user")   //要加上这个注解,就会保存到内存中
public User getUser() {
	//访问service获取user对象
	User u = new User(1,"tom",21);
	return u;
}

//当方法被执行时springmvc会先从模型中拿出名字叫指定的对象名(user)或者变量名
//如果模型中有,则直接拿来使用,不需要创建新的对象,如果不存在则通过反射机制创建对应类型
@RequestMapping("/test7")
public String test7(@ModelAttribute("user") User u) { //要与上面的保证相同
	System.out.println("ModelAttributeController test7()...");
	System.out.println("u="+u);
	return "test";
}

在这里插入图片描述

@ModelAttribute("user")   //要加上这个注解,就会保存到内存中
public User getUser() {
	//访问service获取user对象
	User u = new User(1,"tom",21);
	return u;
}

@RequestMapping("/test8")
public String test8(ModelMap model) { 
	System.out.println("ModelAttributeController test8()...");
	System.out.println("user="+model.get("user"));//直接通过key值user去取
	//能取到就证明了@ModelAttribute("user") 修饰了的方法
	//	public User getUser(){} 方法会自动执行  
	return "test";
	//user=User [id=1, name=tom, age=21]  可以拿到user对象
}

作用3.把功能处理方法的返回值添加到模型数据中

@RequestMapping("/model_attribute")
@Controller
public class ModelAttributeController {
	//springmvc会将映射路径作为视图名进行解析
	//会找springmvc/jsp/model_attribute/test9.jsp
	@RequestMapping(value="/test9")
	public @ModelAttribute("u") User test9(){ //@ModelAttribute("u")作为返回值来用
		User user = new User();
		user.setName("jack");
		return user;//返回对象
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值