spring mvc的表单类型转换(custom property editor)

spring mvc的表单类型转换太强大了,目前用到了两个简单的,

一个是将表单中的file自动映射成byte[],这样文件上传(如果使用blob)就无需写任何代码了。

另一个是将表单中的yyyy-MM-dd格式映射成java.util.Date,

假设User.java中有如下这两种特殊的属性:

public class User implements Serializable{
    private Date birth;
    private byte[] icon;
}
```注册这两种属性编辑器只需在Controller中定义如下这样一个initBinder方法:





<div class="se-preview-section-delimiter">div>

这里写代码片
“`

@Controller("userController")
@RequestMapping(value = "/user")
public class UserController {
    @RequestMapping(value = "create", method = RequestMethod.POST)

    public String create(@ModelAttribute("user") User user,

            RedirectAttributes redirectAttributes) {

        userService.createUser(user);

        redirectAttributes.addFlashAttribute("message", "create success!");

        return SUCCESS;

    }    

    @InitBinder
    protected void initBinder(
            WebDataBinder binder) throws ServletException {
        binder.registerCustomEditor(byte[].class,
                new ByteArrayMultipartFileEditor());         

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
                dateFormat.setLenient(false);
                binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
    }
}

ByteArrayMultipartFileEditor和CustomDateEditor都是spring直接提供的。
自定义的:

  public class User implements Serializable{
    public Set roles = new HashSet();
    }
public class Role implements Serializable {
    private Long id;
    private String name;

UserController如下:

@RequestMapping(value = "create", method = RequestMethod.GET)
public String createForm(ModelMap model) {
    model.addAttribute("roleList", roleService.findAllRoles());
    User user = new User();
    model.addAttribute(user);
    return "user/user_new";
}
public class RoleEditor extends PropertyEditorSupport {2
    private RoleService roleService;
    public RoleEditor(RoleService roleService) {
        this.roleService = roleService;
    }
    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        if (text != null) {
            Role role = roleService.findRoleById(Long.valueOf(text));
            setValue(role);
        } else {
            setValue(null);
        }
    }
}

并在UserController中的initBinder方法中注册该编辑器

@InitBinder
protected void initBinder(
        WebDataBinder binder) throws ServletException {
    //@see http://forum.springsource.org/showthread.php?59612-Service-injection-amp-PropertyEditor
    binder.registerCustomEditor(Role.class, new RoleEditor(roleService));
}

这时在UserController的create方法中取得的User对象就是已经绑定了roles的了

@RequestMapping(value = "create", method = RequestMethod.POST)
public String create(@ModelAttribute("user") User user,
        RedirectAttributes redirectAttributes) {
    userService.createUser(user);
    redirectAttributes.addFlashAttribute("message", "create success!");
    return SUCCESS;
}

值得注意的是,你必须要覆写Role的equals和hashCode方法,不然当你进入修改页面时,user的role属性不会自动的check上。

你可能感兴趣的:(spring mvc的表单类型转换(custom property editor))