• 在开启SpringMVC容器的时候,会注册一些默认的属性编辑器,这些编辑器定义了一些属性类型的转换,对于不同的类型,有相应的属性编辑器与之绑定。这就组成了一些基本的属性转换器。
  • 对于这些默认的属性转换器,如果不符合我们的预期,可以进行修改。

局部属性编辑器

  • 处理方法:
@RequestMapping("/propertyEditor.do")
public String dateFormat(Date birthday){
    System.out.println(birthday);
    return "success";
}

这里使用系统默认,只要传递过来的字符串按照一定的格式就可以进行转换,但是这里我们不按照系统默认的格式进行传输。

  • 提交的表单:
<form action="propertyEditor.do">
    用户名 :<input type="text" name="userName">
    生日:<input type="text" name="birthday">
    <button type="submit">提交</button>
</form>

这里写图片描述
报错
这里写图片描述

这时候,在处理方法所在类中自定义一个时间属性编辑器:

/**
 * 时间属性编辑器
 */
@InitBinder
public void initBinder(DataBinder bin){
    //定义格式化
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    //定制一个时间属性编辑器
    CustomDateEditor cust = new CustomDateEditor(sdf, true);
    //将这个属性编辑器绑定到Date类型上
    bin.registerCustomEditor(Date.class,cust);
}

再执行:
执行成功并跳转到success.jsp页面
这里写图片描述

  • Spring为我们提供了大量的编辑器实现类,诸如
    CustomDateEditor,CustomBooleanEditor,CustomNumberEditor等都是继承自PropertyEditorSupport类。
  • 使用时候调用DataBinder的registerCustomEditor方法进行注册。
  • 或者使用DataBinder的子类WebDataBinder进行注册。一般开发会使用WebDataBinder多些

registerCustomEditor源码:

public void registerCustomEditor(Class<?> requiredType, PropertyEditor propertyEditor) {
    getPropertyEditorRegistry().registerCustomEditor(requiredType, propertyEditor);
}
  • 第一个参数requiredType是需要转化的类型。
  • 第二个参数PropertyEditor是属性编辑器,它是个接口,以上提到的如CustomDateEditor等都是继承自实现了这个接口的PropertyEditorSupport类。

也可以自定义一个编辑器:

import org.springframework.beans.propertyeditors.PropertiesEditor;

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 可以指定value,如果不指定则为所有的相关类型参数进行添加自定义编辑器。 如果指定,则是为指定的参数添加。如:
@InitBinder(“data1”) 为属性名称为data1的参数添加自定义的属性编辑器。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐