Spring MVC 提供了以下几种途径输出模型数据(默认情况:模型数据会自动保存到request域对象中):
- ModelAndView: 处理方法返回值类型为ModelAndView 时, 方法体即可通过该对象添加模型数据
- Map及Model: 入参为org.springframework.ui.Model、org.springframework.ui.ModelMap 或 java.uti.Map 时,处理方法返回时,Map中的数据会自动添加到模型中。
- @SessionAttributes: 将模型中的某个属性暂存到 HttpSession 中,以便多个请求之间可以共享这个属性
- @ModelAttribute: 方法入参标注该注解后, 入参的对象就会放到数据模型中
- ModelAndView:在测试方法中创建ModelAndView返回
控制器处理方法的返回值如果为ModelAndView, 则其既包含视图信息,也包含模型数据信息。
- Index.jsp
<a href="springmvc/TestModelAndView">TestModelAndView</a></br>
- 测试方法
@RequestMapping("/TestModelAndView")
public ModelAndView testModelAndView() {
// 1.创建一个modelandview对象,提供一个视图的信息
// 因为ModelAndView 里面包含两部分信息:一个model,还有一个是view
ModelAndView mv = new ModelAndView("success");
// 2.是向modelAndView中添加模型数据,现在下面的数据会默认保存到requet域对象
mv.addObject("name", "xiaomi");
// 3.返回modelAndView
return mv;
}
- Success.jsp
request域 name的信息: ${requestScope.name}<br>
- Map:一般作为测试方法的入参
- Spring MVC 在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器。
- 如果方法的入参为Map或Model类型,Spring MVC会将隐含模型的引用传递给这些入参。在方法体内,开发者可以通过这个入参对象访问到模型中的所有数据,也可以向模型中添加新的属性数据。
- Index.jsp
<a href="springmvc/TestMap">TestMap</a></br>
- 测试方法
@RequestMapping("/TestMap")
public String testMap(Map<String, Object> map) {
// 如果方法 的入参是一个map对象,那么map对象中的模型数据会自动加入到request域对象中
map.put("gender", "女");
map.put("age", 19);
return success;
}
- Success.jsp
request域 gender的信息: ${requestScope.gender}<br>
request域 age的信息: ${requestScope.age}<br>
- @SessionAttributes
- 若希望在多个请求之间共用某个模型属性数据,则可以在控制器类上标注一个@SessionAttributes,Spring MVC将在模型中对应的属性存到 HttpSession中。
- @SessionAttributes 除了可以通过属性名指定需要放到会话中的属性外,还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中
@SessionAttributes(types=User.class) 会将隐含模型中所有类型为User.class 的属性添加到会话中。
@SessionAttributes(value={“user1”, “user2”}) 会将隐含模型中key类型为user1和user2的属性添加到会话中。
@SessionAttributes(types={User.class,Dept.class})
@SessionAttributes(value={“user1”, “user2”},types={Dept.class})
Request域中也会有
- Index.jsp
<a href="springMVC2/TestSessionAttribute">TestSessionAttribute</a></br>
- 测试方法
@RequestMapping("/TestSessionAttribute")
public String testSessionAttribute(Map<String, Object> map) {
User user = new User();
user.setUsername("小米");
user.setAge(18);
user.setPassword("123123");
// map中的数据会默认添加request域对象中
map.put("user", user);
return SUCCESS;
}
- 测试类class上添加@SessionAttributes
@SessionAttributes(value={"user"}, types={String.class})
@RequestMapping("/springmvc")
@Controller
public class SpringMVCTest{}
注意:@SessionAttributes只能够添加在类上,不能添加在方法上
- Success.jsp
request域 name的信息: ${requestScope.name}<br>
request域 gender的信息: ${requestScope.gender}<br>
request域 age的信息: ${requestScope.age}<br>
request域 user的数据:${requestScope.user}</br>
session域 user的数据:${sessionScope.user}</br>
- ModelAttribute
Spring MVC在调用目标处理方法前,会先逐个调用在方法上标注了@ModelAttribute 的方法。
ModelAttribute的作用:
- 放在功能处理方法(指用@ModelAttribute修饰的方法),用于将多个请求参数绑定到一个命令对象,从而简化绑定流程,而且自动暴露为模型数据用于视图页面展示时使用;
- Index.jsp
<a href="springMVC2/TestSessionAttribute">TestSessionAttribute</a></br>
<a href="springMVC2/updateUser?id=1">updateUser</a></br>
<a href="springMVC2/deleteUser?id=1">deleteUser</a></br>
- 测试类
@RequestMapping("/TestSessionAttribute")
public String testSessionAttribute(Map<String, Object> map) {
User user = new User();
user.setUsername("张三");
user.setAge(17);
user.setPassword("123");
// map中的数据会默认添加request域对象中
map.put("user", user);
return SUCCESS;
}
@RequestMapping("/testUser")
public String testUser(User user){
System.out.println(user);
return SUCCESS;
}
//更新用户
@RequestMapping("/updateUser")
public String updateUser(Integer id,User user) {
System.out.println(user);
// 找到了这个用户,就模拟更新了
user.setUsername("赵薇");
System.out.println("更新了该用户");
return SUCCESS;
}
//删除用户
@RequestMapping("/deleteUser")
public String deleteUser(Integer id,User user) {
System.out.println(user);
// 找到了这个用户,就模拟删除了
System.out.println("删除了该用户");
return SUCCESS;
}
代码执行流程:
1. 执行 @ModelAttribute 注解修饰的方法: 从数据库中取出对象, 把对象放入到了 Map 中. 键为: user
2. SpringMVC 从 Map 中取出 User 对象, 并把表单的请求参数赋给该 User 对象的对应属性.
3. SpringMVC 把上述对象传入目标方法的参数.