作用:可以将值存放到模型中,也可以从模型中取出
保存数据的级别:
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;//返回对象
}
}