首页 > 代码库 > SpringMVC确定目标方法POJO类型入参的过程

SpringMVC确定目标方法POJO类型入参的过程

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="http://www.mamicode.com/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="http://www.mamicode.com/user"),存在value=http://www.mamicode.com/user,但是session域中不存在user对象,会抛出异常"http://www.mamicode.com/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="http://www.mamicode.com/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调用

 

SpringMVC确定目标方法POJO类型入参的过程