1:代码实例
@InitBinder public void initBinder(WebDataBinder binder) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); dateFormat.setLenient(false); binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); binder.registerCustomEditor(SystemInfo.class, new PropertyEditorSupport() { @Override public void setAsText(String text) throws IllegalArgumentException { if (!StringUtils.hasText(text)) { return; } { Long systemInfoId = Long.valueOf(text); SystemInfo systemInfo = systemInfoService.findById(systemInfoId); setValue(systemInfo); } } }); binder.registerCustomEditor(Category.class, new PropertyEditorSupport() { @Override public void setAsText(String text) throws IllegalArgumentException { if (!StringUtils.hasText(text)) { return; } else { Long categoryId = Long.valueOf(text); Category category = categoryService.findById(categoryId); setValue(category); } } }); }
- <form:form modelAttribute="categoryEditForm" id="categoryForm" method="post" action="saveOrUpdate.do">
- <form:hidden path="category.objectId" />
- <input type="hidden" name="category.parent" value="${categoryEditForm.category.parent.objectId}"/>
- <input type="hidden" name="category.systemInfo" value="${categoryEditForm.category.systemInfo.objectId }"/>
- <div class="area">
- <div class="areaTitle">
- <div class="inner">
- <label>Category Information Form</label>
- <div class="clear"></div>
- </div>
- </div>
- </div>
- <div class="areaBody">
- <table class="formTable">
- <tbody>
- <tr>
- <td colspan="4">
- <span class="button"><span><a href="javascript:sumbit();" class="btnSave">Submit</a></span></span>
- </td>
- </tr>
- <tr>
- <td colspan="4"> </td>
- </tr>
- <tr>
- <td align="right">Parent Category Name:</td>
- <td colspan="3"><form:input path="category.parent.name.fullName" readonly="true" id="parentCategory" cssClass="input readOnly" /></td>
- </tr>
- <tr>
- <td align="right">Current Category Name:</td>
- <td><form:input path="category.name.fullName" id="categoryName" cssClass="input"/></td>
- <td align="right">description:</td>
- <td><form:input path="category.description" id="description" cssClass="input"/></td>
- </tr>
- </tbody>
- </table>
- </div>
- </form:form>
2、实例2
spring mvc的表单类型转换(custom property editor)
spring mvc的表单类型转换太强大了,目前用到了两个简单的,
一个是将表单中的file自动映射成byte[],这样文件上传(如果使用blob)就无需写任何代码了。
另一个是将表单中的yyyy-MM-dd格式映射成java.util.Date,
假设User.java中有如下这两种特殊的属性:
1 |
public class User implements Serializable{
|
2 |
private Date birth;
|
3 |
private byte [] icon;
|
4 |
} |
注册这两种属性编辑器只需在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!" );
|
09 |
10 |
return SUCCESS;
|
11 |
}
|
12 |
|
13 |
@InitBinder
|
14 |
protected void initBinder(
|
15 |
WebDataBinder binder) throws ServletException {
|
16 |
binder.registerCustomEditor( byte []. class ,
|
17 |
new ByteArrayMultipartFileEditor());
|
18 |
|
19 |
SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd" );
|
20 |
dateFormat.setLenient( false );
|
21 |
binder.registerCustomEditor(Date. class , new CustomDateEditor(dateFormat, false ));
|
22 |
}
|
23 |
} |
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>();
|
1 |
public class Role implements Serializable {
|
2 |
private Long id; //
|
3 |
private String name; //
|
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" ;
|
7 |
} |
1 |
< div class = "control-group" >
|
2 |
< label class = "control-label" for = "roles" >角色:</ label >
|
3 |
< div class = "controls" >
|
4 |
< sf:checkboxes path = "roles" items = "${roleList }" itemValue = "id" itemLabel = "name" />
|
5 |
</ div >
|
6 |
</ div >
|
可以像这样定义RoleEditor.java
01 |
public class RoleEditor extends PropertyEditorSupport {
|
02 |
private RoleService roleService;
|
03 |
04 |
public RoleEditor(RoleService roleService) {
|
05 |
this .roleService = roleService;
|
06 |
}
|
07 |
08 |
@Override
|
09 |
public void setAsText(String text) throws IllegalArgumentException {
|
10 |
if (text != null ) {
|
11 |
Role role = roleService.findRoleById(Long.valueOf(text));
|
12 |
setValue(role);
|
13 |
} else {
|
14 |
setValue( null );
|
15 |
}
|
16 |
}
|
17 |
} |
1 |
@InitBinder |
2 |
protected void initBinder(
|
3 |
WebDataBinder binder) throws ServletException {
|
4 |
//@see http://forum.springsource.org/showthread.php?59612-Service-injection-amp-PropertyEditor
|
5 |
binder.registerCustomEditor(Role. class , new RoleEditor(roleService));
|
6 |
} |
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!" );
|
6 |
7 |
return SUCCESS;
|
8 |
} |
值得注意的是,你必须要覆写Role的equals和hashCode方法,不然当你进入修改页面时,user的role属性不会自动的check上。
RoleEditor可以简化成
public class RoleEditor extends PropertyEditorSupport {
@Override
public void setAsText(String text) throws IllegalArgumentException {
if (text != null) {
Role role = new Role();
role.setId(Long.valueOf(text));
setValue(role);
} else {
setValue(null);
}
}
}
保存时只用了id值,没有必要去数据库再查找一次
相关推荐
在上面的代码中,我们使用了 @InitBinder 注解来标注 initBinder 方法,并在该方法中使用 WebDataBinder 的 registerCustomEditor 方法来注册一个自定义的日期编辑器,用于将字符串类型的日期转换为 Date 类型。...
Spring MVC 使用 @InitBinder 标签对表单数据绑定的方法 Spring MVC 框架中, Bean 中定义了 Date、double 等类型,如果没有做任何处理的话,日期以及 double 都无法绑定。这是因为 Spring MVC 框架中的数据绑定...
例如,我们可以使用@InitBinder注解来指定要绑定的参数,并注册自定义的编辑器,用于将请求参数转换为对应的类型。此外,@InitBinder注解也可以用于解决前端传递的日期参数验证异常。 五、结论 本文主要介绍了...
Spring MVC提供了类型转换机制,确保请求参数可以被正确地转换为预期的数据类型。如上面源码所示,Spring 自带了一系列默认的`PropertyEditor`实现,支持诸如`CharSet`、`Class`、`Locale`等类型。如果需要自定义...
当请求参数与控制器方法参数类型不完全匹配时,Spring MVC会尝试进行默认转换。例如,字符串"true"会被自动转换为布尔值true。如果转换失败,Spring MVC会抛出异常。 3. **POJO类型**: 对于复杂的Java对象,可以...
在Spring 3.1之前的版本中,如果需要对特定类型的参数进行格式化或者转换,可以使用`@InitBinder`注解来注册一个自定义的编辑器(`CustomEditor`)或转换器(`Converter`)。下面是一个例子: ```java import org....
ConversionService可以自动识别该转换器,并在Spring MVC进行参数转换时使用。 四、自定义转换器 在Spring MVC中,可以通过使用@InitBinder添加自定义的编辑器。例如,可以使用@InitBinder来注册自定义的日期编辑...
本篇文章将详细探讨`Spring MVC`中的`SimpleFormController`类及其使用方法。 `SimpleFormController`是Spring MVC早期版本中用于处理表单数据的控制器类,它为开发者提供了一种简化表单处理的抽象。在Spring 3.0...
Spring MVC 是一款基于Java的轻量级Web应用框架,它为构建MVC(Model-View-Controller)模式的Web应用程序提供了强大的支持。本资源“spring mvc 架构源代码”是一个完整的、可运行的Spring MVC项目,适用于初学者和...
`CustomEditor`是Spring MVC提供的一种早期的数据转换方式,主要用于简单的类型转换。我们可以通过注册自定义的`PropertyEditor`来处理特定类型的转换。首先,我们需要创建一个继承自`PropertyEditorSupport`的类,...
11. **转换器与格式化器**:`@InitBinder` 可以注册自定义的转换器和格式化器,处理不同数据类型的转换。 12. **RESTful风格**:通过`@RequestMapping`注解的path变量和HTTP动词,可以方便地实现RESTful API。 13....
`initBinder`方法接收一个`WebDataBinder`参数,然后通过`binder.registerCustomEditor`注册我们的`IntEditor`,这样Spring MVC就能在处理请求时使用这个转换器来处理非布尔类型的`int`值。 接着,我们定义一个处理...
Spring MVC 使用 `ViewResolver` 来解析视图名称并将其转换成实际的视图对象。默认情况下,Spring MVC 使用 `InternalResourceViewResolver` 来解析 JSP 视图。例如: ```java @Bean public ViewResolver ...
背景在使用 SpingMVC 框架的项目中,经常会遇到页面某些数据要转换成类型是 Date、Integer、Double 等的数据绑定到控制器的实体。Sprin
在Spring MVC框架中,数据类型转换、数据格式化和数据校验是开发Web应用程序时不可或缺的部分。这些功能有助于确保从客户端接收到的数据准确无误,同时提供了一种优雅的方式来处理和展示这些数据。本篇文章将深入...
Spring MVC 是 Spring 框架的一个模块,主要负责处理 Web 应用中的请求和响应。在 Spring 3.3.2 版本中,它引入了丰富的注解,使得开发者可以更加简洁、高效地实现 MVC 架构。下面将详细阐述 Spring MVC 的注解实现...
它可以与任何POJO类型结合,将请求体转换为Java对象。 7. `@ResponseBody`:表示方法的返回值将直接写入HTTP响应体,而非视图解析。常用于返回JSON或XML格式的数据。 8. `@ModelAttribute`:主要用于绑定请求参数...
Spring 3.0注解是该版本引入的重要特性,极大地简化了Spring MVC框架的配置和使用。Spring MVC是一个强大的Web应用程序开发框架,它允许开发者构建模块化的、松耦合的Web应用,支持RESTful风格的请求处理。在这个...
总的来说,Spring MVC通过模型绑定机制和自定义编辑器实现了将checkbox的值(通常是字符串"on"或空字符串)转换为int类型的数据,并将这些数据绑定到模型对象的属性上。这使得我们可以方便地处理表单数据,尤其是在...