表单数据和JavaBean
的属性值可能不对应,表单中需要输入时间,JavaBean
中的属性是Date
类型,但是表单数据设置到Bean
的值是String
类型,这就导致类型不同抛出异常。 所以有必要进行类型的转化。(默认的转换器已经能满足大部分需求)
Spring
提供了3种转换器接口:
1. Converter<S,T>
2. ConverterFactory<S,R>
3. GenericConverter
下面实现Converter
接口。
JavaBean
:
public class User implements Serializable {
private String loginname;
private Date birthday;
public String getLoginname() {
return loginname;
}
public void setLoginname(String loginname) {
this.loginname = loginname;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
表单:
<form action="/register" method="post">
<table>
<tr>
<td><label>登录名: </label></td>
<td><input type="text" name="loginname"></td>
</tr>
<tr>
<td><label>生日: </label></td>
<td><input type="text" name="birthday"></td>
</tr>
<tr>
<td>
<input type="submit" value="登录">
</td>
</tr>
</table>
</form>
控制器:
@Controller
public class UserController {
private static final Log logger = LogFactory.getLog(UserController.class);
@RequestMapping(value = "/{formName}")
public String loginForm(
@PathVariable(value = "formName") String formName) {
return formName;
}
@RequestMapping(value = "/register", method = RequestMethod.POST)
public String register(
@ModelAttribute User user, Model model) {
logger.info(user.getBirthday() + "-------------------");
model.addAttribute("user", user);
return "success";
}
}
到现在为止还没有添加自定义的转换器,如果此时提交表单,会发生错误。所以需要添加必须的转换器:
public class StringToDateConverter implements Converter<String, Date> {
private String datePattern;
public StringToDateConverter() {}
public StringToDateConverter(String datePattern) {
this.datePattern = datePattern;
}
public void setDatePattern(String datePattern) {
this.datePattern = datePattern;
}
@Override
public Date convert(String s) {
try {
SimpleDateFormat dateFormat = new SimpleDateFormat(datePattern);
return dateFormat.parse(s);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
通过转化器将String
类型转化为Date
类型数据。将转化器添加到配置文件中:
<mvc:annotation-driven conversion-service="conversionService"/>
<!-- 自定义的类型转换器 -->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="converter.StringToDateConverter" p:datePattern="yyyy-MM-dd"></bean>
</set>
</property>
</bean>
有了转换器就能成功将String
类型转化为Date
。