被@ModelAttribute注解修饰的方法,会在每个目标方法调用之前被SpringMVC调用 /* * 被@ModelAttribute注解修饰的方法,会在每个目标方法调用之前被SpringMVC调用 */@ModelAttributepublic void getUser(@Req
/* * 被@ModelAttribute注解修饰的方法,会在每个目标方法调用之前被SpringMVC调用 */ @ModelAttribute public void getUser(@RequestParam(value="id",required=false)Integer id,Map@ModelAttribute注解运行流程map) { if(id != null) { /* * 这里本意是从数据库中获取对象属性然后封装成对象 * 但是模拟省去,直接new */ Student stu=new Student(1, "zsl", "sddas", "zsl@yeah.net"); System.out.println("从数据库中获取该对象="+stu); map.put("student", stu); } }
/**
* 运行流程
* 1. 运行@ModelAttribute注解修饰的方法,从数据库中取出数据,并将该数据封装成对象放入map中,value为"stu"
* 2. SpringMVC从map中取出对象stu,把表单的请求参数附给对象对应的参数
* 3. SpringMVC把该对象传入目标方法的参数
*
* 注意: map中的键需与目标方法的入参名一致
*
* SpringMVC确定目标方法POJO类型入参的过程
* 1. 确定一个 key
* 1). 若目标方法的 POJO 类型参数没有使用@ModelAttribute注解修饰,则 key 为POJO类型的第一个字母小写的字符串
* 2). 若使用了@ModelAttribute注解修饰,则 key 为@ModelAttribute注解的 value 值
* 2.在 implicitModel 中查询有 key 对应的对象,则作为入参传入
* 1).若在@ModelAttribute标记的方法中在 Map 中保存过,且 key 和1中对应的 key 一致,则会获取到
* 3.若 implicitModel 中查询不到 key 对应的对象,则检查当前 Handler 是否使用@SessionAttributes注解修饰,
* 若使用了该注解,且@SessionAttributes注解的 value 属性值中包含了 key,则会从 sessionScope 中获取 key
* 所对应的 value 值,若存在将传入方法入参,若不存在,则抛出异常。
* 4.若 Handler 没有标识@SessionAttributes注解或@SessionAttributes注解的value属性值中不包含 key 值,
* 会通过反射来创建对应的 POJO 类型的对象,传入目标方法作为入参。
* 5.SpringMVC会将 key 和 POJO 类型的对象保存到 implicitModel 中,进而保存到 requestScope 中。
*/
@RequestMapping("/testModelAttribute")
public String testModelAttribute(Student stu) {
System.out.println("修改后的User="+stu);
return success;
}
index1.jsp请求页面(包含了testModelAttribute,testModelAndView,testRequestParam等测试案例的请求)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
Test ModelAndView
Test Map
Test SessionAttributes
Test testView =
