SpringMVC 之@ModelAttribute

使用场景:在控制器方法获取用户表单传来的POJO,而且根据POJO修改数据库时,会出现有些字段数据没有出如今实参的POJO中,可是若是直接修改会致使那些没有赋值的字段变为null,因此须要引入@ModelAttribute。web

@ModelAttribute思想是把用户表单数据封装成POJO对象前,从数据库取出对应记录并封装成POJO对象,而后根据表单数据修改这个POJO对象,那么那些没有数据的字段就仍然会是原先数据库中的数据。spring

因此,须要如下步骤数据库

  1. 在获得用户表单数据后,可是在封装成POJO对象前,从数据库中取出数据并封装。
  2. 把封装好的对象交给SpringMVC
  3. SpringMVC根据表单数据修改上一步传入的POJO对象
  4. SpringMVC把修改后的对象做为控制器中具体用来修改数据库的方法的实参传入。
  5. 执行数据库修改操做

顺便整理没有使用@ModelAttribute以前的步骤markdown

  1. SpringMVC建立一个新的POJO对象,而后根据表单传入的数据修改对象数据
  2. SpringMVC把修改后的对象做为控制器中具体用来修改数据库的方法的实参传入。
  3. 执行数据库修改操做

因此,使用@ModelAttribute后,增长了一、2两步,而且把第三步中原来应新建立的对象改成从数据库中取出并封装好的对象。session

具体实现其实添加一、2两步工做就好,第三步的差异会由SpringMVC自动识别并进行改变。app

一、2两步也能够合并为一步,具体为编写一个方法,在其中取出数据库数据并封装,而后把它添加到ModelMap中。而这个方法只须要添加@ModelAttribute注解,SpringMVC将会自动在获得用户表单数据后,可是在封装成POJO对象前调用。如下为一个例子:ui

//在执行全部方法以前自动执行该方法
@ModelAttribute
public void getUser(@RequestParam(value = "id",required = false)Integer id,ModelMap map){
    if (id!=null){
        //此处经过硬编码赋值的方式建立一个新的POJO对象,可是实际过程当中应该是从数据库中取出数据而且封装而成的。
        User user = new User();
        user.setId(1);
        user.setUsername("tom");
        user.setPassword("123456");
        user.setAge(22);
        //把建立好的对象放入ModelMap中
        map.put("user",user);
    }
}

@RequestMapping("/modelAttribute")
public String modelAttribute(User user){
    System.out.println(user);
    return "success";
}

固然这里还有一些问题要处理:编码

  1. 添加了@ModelAttribute注解的方法将在全部控制器方法执行以前执行,因此必需要判断具体状况并执行咱们想要的代码。上述例子中是经过判断是否存在id,这个id是经过表单传入的,而其余方法不会传入该属性。
  2. 在map中放入放入的键值对的键默认为POJO类名并把首字母改成小写。若是须要自定义该键名,则须要在控制器方法的POJO类型形参前加入@ModelAttribute而且把value属性改成须要自定义的键名。如:@ModelAttribute(value = “myuser”)User user
  3. 若是在ModelMap中不存在对应的键值对,那么SpringMVC会判断当前的控制器类是否添加了SessionAttribute注解,若是添加了且value属性中有对应的键名(在上述例子中就是user),可是实际的session中找不到该键值对,那么SpringMVC将会抛出异常,例如:org.springframework.web.HttpSessionRequiredException: Session attribute ‘user’ required - not found in session
  4. 若是在ModelMap中不存在对应的键值对,或当前控制器类没有添加SessionAttribute注解,或添加了SessionAttribute注解可是value属性没有对应的键名,SpringMVC将会经过反射机制建立一个新的POJO对象传入对应的方法中。
  5. 若是在同一控制器中定义了多个有@ModelAttribute注解的方法,则按在类中定义的顺序反序执行。
相关文章
相关标签/搜索