转载地址:
http://my.oschina.net/uniquejava/blog/85727
spring mvc的表单类型转换太强大了,目前用到了两个简单的,
一个是将表单中的file自动映射成byte[],这样文件上传(如果使用blob)就无需写任何代码了。
另一个是将表单中的yyyy-MM-dd格式映射成java.util.Date,
假设User.java中有如下这两种特殊的属性:
1 | public class User implements Serializable{ |
注册这两种属性编辑器只需在Controller中定义如下这样一个initBinder
方法:
01 | @Controller ( "userController" ) |
02 | @RequestMapping (value = "/user" ) |
03 | public class UserController { |
04 | @RequestMapping (value = "create" , method = RequestMethod.POST) |
05 | public String create( @ModelAttribute ( "user" ) User user, |
06 | RedirectAttributes redirectAttributes) { |
07 | userService.createUser(user); |
08 | redirectAttributes.addFlashAttribute( "message" , "create success!" ); |
14 | protected void initBinder( |
15 | WebDataBinder binder) throws ServletException { |
16 | binder.registerCustomEditor( byte []. class , |
17 | new ByteArrayMultipartFileEditor()); |
19 | SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd" ); |
20 | dateFormat.setLenient( false ); |
21 | binder.registerCustomEditor(Date. class , new CustomDateEditor(dateFormat, false )); |
ByteArrayMultipartFileEditor和CustomDateEditor都是spring直接提供的。可以参考这两个类的源码,
高级的自定义的还没用过,等用到的时候再补充到这里(2012-11-04补充)
今天终于用到了自定义的Editor,我现在有一个User对象,它有一个Set<Role> roles集合。
1 | public class User implements Serializable{ |
2 | public Set<Role> roles = new HashSet<Role>(); |
Role有id和name属性,
1 | public class Role implements Serializable { |
UserController如下
1 | @RequestMapping (value = "create" , method = RequestMethod.GET) |
2 | public String createForm(ModelMap model) { |
3 | model.addAttribute( "roleList" , roleService.findAllRoles()); |
4 | User user = new User(); |
5 | model.addAttribute(user); |
6 | return "user/user_new" ; |
我的user_new.jsp如下:
1 | < div class = "control-group" > |
2 | < label class = "control-label" for = "roles" >角色:</ label > |
4 | < sf:checkboxes path = "roles" items = "${roleList }" itemValue = "id" itemLabel = "name" /> |
用户在页面上check一个或多个角色,提交form,这时我们期望user对象中的roles集合能自动绑定用户选择的值,但是提交到服务器上的数据其实是一组roleId,我们需要在自定义的PropertyEditor中将其转成Role对象.
可以像这样定义RoleEditor.java
01 | public class RoleEditor extends PropertyEditorSupport { |
02 | private RoleService roleService; |
04 | public RoleEditor(RoleService roleService) { |
05 | this .roleService = roleService; |
09 | public void setAsText(String text) throws IllegalArgumentException { |
11 | Role role = roleService.findRoleById(Long.valueOf(text)); |
并在UserController中的initBinder方法中注册该编辑器
2 | protected void initBinder( |
3 | WebDataBinder binder) throws ServletException { |
5 | binder.registerCustomEditor(Role. class , new RoleEditor(roleService)); |
这时在UserController的create方法中取得的User对象就是已经绑定了roles的了
1 | @RequestMapping (value = "create" , method = RequestMethod.POST) |
2 | public String create( @ModelAttribute ( "user" ) User user, |
3 | RedirectAttributes redirectAttributes) { |
4 | userService.createUser(user); |
5 | redirectAttributes.addFlashAttribute( "message" , "create success!" ); |
值得注意的是,你必须要覆写Role的equals和hashCode方法,不然当你进入修改页面时,user的role属性不会自动的check上。
这里有人提相同的问题:
http://stackoverflow.com/questions/7421346/spring-binding-listobject-to-formcheckboxes
还有这里
http://stackoverflow.com/questions/8700339/spring-mvc-usage-of-formcheckbox-to-bind-data
参考:
http://www.mkyong.com/spring-mvc/spring-mvc-failed-to-convert-property-value-in-file-upload-form/
http://linkedjava.blogspot.com/2011/06/spring-controller-with-date-object.html(需要FQ)
http://forum.springsource.org/showthread.php?59612-Service-injection-amp-PropertyEditor