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上。