• 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="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调用
    
  • 相关阅读:
    expected type: java.lang.Double, actual value: java.math.BigDecimal
    解压大文件提示C盘空间不足的问题
    typeError: cannot read property '_wrapper' of undefined
    在webwork中格式化货币(带千分位的数值)
    Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
    mui返回到顶部
    vue中使用js-xlsx实现前端导入导出功能
    Web Components实践开发Tab组件
    帝王师:张居正——读书笔记
    数学与生活——读书笔记
  • 原文地址:https://www.cnblogs.com/lzzhuany/p/6979859.html
Copyright © 2020-2023  润新知