日常提交

This commit is contained in:
2022-11-29 22:40:50 +08:00
parent fa8dd3f67f
commit cb3ef91737

View File

@@ -276,5 +276,55 @@ public void handle(@CookieValue("JSESSIONID") String cookie) {
} }
``` ```
如果注解标注参数的类型不是String会自动执行类型转换。 如果注解标注参数的类型不是String会自动执行类型转换。
#### @ModelAttribute
可以为handler method的参数添加@ModelAttribute注解在添加该注解之后参数属性的值可以从Model中进行获取如果model中不存在则对该属性进行初始化。
**Model属性会被http servlet param中的值覆盖如果request param name和field name相同。**
> @ModelAttribute注解其name的默认值为方法参数或者返回值类型的首字母小写
> 例如“orderAddress" for class "mypackage.OrderAddress"
@ModelAttribute的使用具体可如下所示
```java
@PostMapping("/owners/{ownerId}/pets/{petId}/edit")
public String processSubmit(@ModelAttribute Pet pet) {
// method logic...
}
```
参数pet可以通过如下方式进行获取
1. pet参数已经加上了@ModelAttribute属性故而可以从model中进行获取
2. 如果该model attribute已经出现在类级别的@SessionAttribute中则可以在session中进行获取
3. 如果model attribute name和request param name或者path variable name相匹配那么可以通过converter来进行获取
4. 通过默认的构造器进行初始化
5. 通过primary constructor进行构造主构造器参数和servlet request param相匹配
在使用@ModelAttribute时可以创建一个Converter<Stirng,T>类型的bean对象用于类型转换当model attribute name和path variable或者request param name相匹配且Converter<String,T>对象存在时会调用该Converter进行类型转换
```java
@Component
class StringPersonConverter implements Converter<String,Person> {
@Override
public Person convert(String source) {
return new Person("kazusa",true,21);
}
}
@RestController
public class ModelAttributeController {
@PostMapping("/hello")
public Person sayHello(@ModelAttribute(name="name",binding=true) Person person, Model model) {
System.out.println(model);
return person;
}
}
```
在model attribute被获取之后会执行data binding。WebDataBinder会将request param name和目标对象的field进行匹配匹配的field会通过类型转换进行注入。
如果想要访问Model Attribute但是不想使用data binding可以直接在handler method参数中使用Model或者将@ModelAttribute注解的binding属性设置为false
```java
@PostMapping("update")
public String update(@Valid AccountForm form, BindingResult result,
@ModelAttribute(binding=false) Account account) {
// ...
}
```