> 用于controller的方法上,配置这个controller的属性绑定规则
# **1.对数据绑定进行设置**
WebDataBinder中有很多方法可以对数据绑定进行具体的设置:比如我们设置name属性为非绑定属性(也可以设置绑定值setAllowedFields):
在Controller中添加一个方法:
```
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setDisallowedFields("name");
}
```
这样表单中的name属性就不会绑定到方法参数上
# **2.注册已有的编辑器**
1. WebDataBinder是用来绑定**请求参数到指定的属性编辑器**.
2. 由于前台传到controller里的值是String类型的,当往Model里Set这个值的时候,如果set的这个属性是个对象,Spring就会去找到对应的editor进行转换,然后再set进去!
3. Spring自己提供了大量的实现类(如下图所示的在org.springframwork.beans.propertyEditors下的所有editor),诸如CustomDateEditor ,CustomBooleanEditor,CustomNumberEditor等许多,基本上够用。 在平时使用SpringMVC时,会碰到javabean中有Date类型参数,表单中传来代表日期的字符串转化为日期类型,SpringMVC默认不支持这种类型的转换。我们就需要手动设置时间格式并在webDateBinder上注册这个编辑器!
如下,这个时间Editer,对时间属性进行绑定的时候,按照如下格式进行转换
~~~
@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
}
~~~
# **3.注册自定义编辑器**
使用自定义编辑器就是在第二个的基础上添加个自定义编辑器就行了,自定义的编辑器类需要继承
~~~
org.springframework.beans.propertyeditors.PropertiesEditor;
~~~
并重写其setAsText和getAsText两个方法就行了!
```
public class DoubleEditor extends PropertyEditorSupport {
@Override
public void setAsText(String text) throws IllegalArgumentException {
if (text == null || text.equals("")) {
text = "0";
}
setValue(Double.parseDouble(text));
}
@Override
public String getAsText() {
return getValue().toString();
}
}
```
然后在InitBinder方法中注册就行。
# **3.设置属性的前缀可以实现参数绑定**
入代码所示:
jsp:
```
<form action="/testBean" method="post">
name: <input type="text" name="u.name"> <br>
age: <input type="text" name="u.age"> <br>
name: <input type="text" name="s.name"> <br>
age: <input type="text" name="s.age"> <br>
<input type="submit">
</form>
```
controller:
```
@InitBinder("user")
public void init1(WebDataBinder binder) {
binder.setFieldDefaultPrefix("u.");
}
@InitBinder("stu")
public void init2(WebDataBinder binder) {
binder.setFieldDefaultPrefix("s.");
}
@RequestMapping("/testBean")
public ModelAndView testBean(User user, @ModelAttribute("stu") Student stu) {
System.out.println(stu);
System.out.println(user);
String viewName = "success";
ModelAndView modelAndView = new ModelAndView(viewName);
modelAndView.addObject("user", user);
modelAndView.addObject("student", stu);
return modelAndView;
}
```
> `@InitBinder("user")`括号内的参数为类的首字母小写(默认命名规则),也可以用`@ModelAttribute("stu")`做限定.