SpringMVC确定目标方法POJO类型入参的过程 访问方法 @RequestMapping("/pojoparam") public String POJOParam(User user){ return "success"; } 1,首先确定一个key值 ①如果目标方法的POJO类型的参数没有使用@ModelAttribute作为入参修饰,则key为POJO类名的第一个字母小写 例test(User user){}这样的方法key就是user ②如果使用了@ModelAttribute来修饰入参,则key为@ModelAttribute注解的value属性值 例test(@ModelAttribute(value="users") User user){} 这样的方法key就是users 2,在Model中查找key对应的对象,若果存在,则作为入参传入 如果在@ModelAttribute标记的方法在Map中保存过这个key的对象,则会获取到 3,若果不存在,则检查这个类是否被@SessionAttributes注解修饰,如果使用该注解,这个注解中value包含了key, 则会从HttpSession中获取key对应的对象,如果存在,则直接传入目标方法的入参中,若不存在,则抛出异常 4,如果这个类没有被@SessionAttributes注解,或者注解的value中不包含key,则会通过反射创建POJO类型的参数,传入为目标方法的参数 5,SpringMVC会把key和POJO类型的对象保存到Model中,进入保存到request中
抛出异常的情况:(导包部分省略)
/** * Model中查询不到user,而且存在@SessionAttributes(value="user"),存在value=user,但是session域中不存在user对象,会抛出异常 */ @SessionAttributes(value="user") @Controller public class ModelAndViewAction { @RequestMapping("/pojoparam") public String POJOParam(User user){ return "success"; } }
抛出的异常:
org.springframework.web.HttpSessionRequiredException: Session attribute 'user' required - not found in session
利用@ModelAttribute()注解标记方法,将User对象提前放入Model当中
@SessionAttributes(value="user") @Controller public class ModelAndViewAction { @ModelAttribute("user") public User getUser(){ Family family=new Family(); family.setCity("上海"); User user=new User(1, "张三啊", 12,family); return user; } @RequestMapping("/pojoparam") public String POJOParam(User user){ return "success"; } }
这样则不会有异常,session域和request域中都存在User对象,key为“user”
@ModelAttribute()注解的方法会在每个目标方法执行前被SpringMVC调用