使用场景:在控制器方法获取用户表单传来的POJO,而且根据POJO修改数据库时,会出现有些字段数据没有出如今实参的POJO中,可是若是直接修改会致使那些没有赋值的字段变为null,因此须要引入@ModelAttribute。web
@ModelAttribute思想是把用户表单数据封装成POJO对象前,从数据库取出对应记录并封装成POJO对象,而后根据表单数据修改这个POJO对象,那么那些没有数据的字段就仍然会是原先数据库中的数据。spring
因此,须要如下步骤数据库
顺便整理没有使用@ModelAttribute以前的步骤markdown
因此,使用@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"; }
固然这里还有一些问题要处理:编码