@ModelAttribute?

@ModelAttribute的原理比较复杂,需要对源码有一定的理解。它可以使被

@ModelAttribute修饰的方法在控制器的处理方法之前调用。
但如果@ModelAttribute标注在方法的入参前,它可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数绑定到对象中,再传入入参。


实际场景:

Spring在进行数据库update全字段更新操作提交表单的时候,从页面获取的数据会封装成一个new的pojo对象,没有带的值为null;所以我们只能更新我们提交的数据。ModelAttribute暂时保存表单pojo对象,覆盖数据库保存的pojo对象的数据即可。

ModelAttribute提前与目标方法运行
/**
 * @author Kayleh
 */
@Controller
public class ModelAttributeTest {

  @RequestMapping("/update")
  public String update(){     
    System.out.println("页面update的bean对象:"+bean);  
  }
  @ModelAttribute
  public void modelAttribute(){     
    System.out.println("ModelAttribute调用了...");  
  }


===========输出=========
ModelAttribute调用了...
页面update的bean对象:bean{......}
可以得出:ModelAttribute标注的方法总会在目标方法(update)前执行。

ModelAttribute可以取出隐含对象的值

@ModelAttribute
  public void TestModelAttribute(Map<String, Object> map){

    POJO pojo = new POJO("kayleh", 1104);
    map.put("value",pojo);
    System.out.println("modelAttribute方法...);
  }
@RequestMapping("/updateBook")
  public String updateBook(@RequestParam(value="author")String author,
      Map<String, Object> model,
      HttpServletRequest request,
      @ModelAttribute("value")POJO pojo
      ){

    System.out.println(pojo);
    return "ok";
  }

@ModelAttribute(“value”)这里如果指定的”value”,value就是从map取出参数的key.如果是@ModelAttribute,没有指定key,SpringMVC会默认使用返回值类型的首字母小写作为key.如pOJO.

评论