@ModelAttribute注解和SpringMVC表单modelAttribute属性

@ModelAttribute注解

1.没有添加@ModelAttribute修饰的方法,在目标方法的参数对实体进行入参,该实体默认会从ModelMap中获取,如果不存在则创建新的对象作为入参参数。在进行数据绑定的时候(doBinder()方法),会将该实体放入到ModelMap中。

2.添加@ModelAttribute修饰的方法,在每个目标方法调用前都会执行该方法。

一般情况下,在form表单修改的时,某项字段规定为不可更改,就需要使用该注解标注的方法,根据id的获取与否,来从数据库中获取对应的实体,然后存放到ModelMap中。

SpringMVC表单ModelAttribute属性

使用SpringMVC表单标签,必须要在request中有一个和表单对应的bean。默认request的键为command。可以通过修改form标签的modelAttribute属性修改键的值。

@SessionAttribute注解和@ModelAttribute注解冲突:

没有使用@ModelAttribute修饰的方法,且在某个目标方法入参使用了@SessionAttribute注解value同名的实体对象,会抛出异常。

原因:

if (implicitModel.containsKey(name)) {
    bindObject = implicitModel.get(name);
} else if (this.methodResolver.isSessionAttribute(name, paramType)) {
    bindObject = this.sessionAttributeStore.retrieveAttribute(webRequest, name);
    if (bindObject == null) {
    raiseSessionRequiredException("Session attribute '" + name + "' required - not found in session");
    }
}
在绑定参数前,此时Model中没有值,然后会进入另一个分支,就会抛出异常。

解决办法:

1.@SesionAttribute和方法入参处使用不同名的value值

2.添加@ModelAttribute修饰的方法,方法内将实体放入ModelMap中。


你可能感兴趣的:(@ModelAttribute)