Converter
Spring的Converter可以将一种类型转换另一种类型的对象,例如:如果希望Spring在将输入的日期字符串绑定到Date时,使用不同的日期样式,需要使用Converter来将字符串转换日期
创建Converter需要实现Converter< String,Date >接口
StringToDateConverter
负责将字符串转换日期
public class StringToDateConverter implements Converter<String ,Date>{
private String datePattern;
public StringToDateConverter(String datePattern) {
this.datePattern = datePattern;
System.out.println("instantiating...converter with patter:*"+datePattern);
}
@Override
public Date convert(String s) {
try {
SimpleDateFormat dateFormat=new SimpleDateFormat(datePattern);
//不要严格解析日期
dateFormat.setLenient(false);
return dateFormat.parse(s);
} catch (ParseException e) {
throw new IllegalArgumentException("invalid date format.Please use this pattern\""
+ datePattern+"\"");
}
}
}
还需要在配置文件中编写conversionService bean,该bean必须提供一个converters属性。它将罗列在应用程序中使用的所有定制Converter,比如上面的StringToDateConverter
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="converter.StringToDateConverter">
<constructor-arg type="java.lang.String" value="yyyy-MM-dd"></constructor-arg>
</bean>
</list>
</property>
</bean>
然后添加mvc:annotation-driven元素的conversion-service属性赋conversionService
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
Employee类
public class Employee implements Serializable{
private static final long serialVersionUID=-9191L;
private long id;
private String firstName;
private String lastName;
private Date birthDate;
private int salaryLevel;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Date getBirthDate() {
return birthDate;
}
public void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
}
public int getSalaryLevel() {
return salaryLevel;
}
public void setSalaryLevel(int salaryLevel) {
this.salaryLevel = salaryLevel;
}
}
Employee对象的控制器EmployeeController
@Controller
public class EmployeeController {
private static final Log logger = LogFactory
.getLog(EmployeeController.class);
@RequestMapping(value = "employee_input")
public String inputEmployee(Model model) {
model.addAttribute(new Employee());
return "EmployeeForm";
}
@RequestMapping(value = "employee_save")
public String saveEmployee(@ModelAttribute Employee employee,
BindingResult bindingResult, Model model) {
if (bindingResult.hasErrors()) {
FieldError fieldError = bindingResult.getFieldError();
logger.info("Code:" + fieldError.getCode() + ",field:"
+ fieldError.getField());
return "EmployeeForm";
}
model.addAttribute("employee", employee);
return "EmployeeDetails";
}
}
在saveEmployee方法的BindingResult参数中设置了Spring的所有绑定错误,该方法利用BindingResult记录所有绑定错误,绑定错误也利用errors标签显示在一个表单中
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>Add Employee Form</title>
</head>
<body>
<div id="global">
<form:form commandName="employee" action="employee_save" method="post">
<fieldset>
<legend>Add an Employee</legend>
<p>
<label for="firstName">First Name:</label>
<form:input path="firstName" tabindex="2" />
</p>
<p>
<form:errors path="birthDate" cssClass="error"/>
</p>
<p>
<label for="birthDate">Date Of Birth:</label>
<form:input path="birthDate" tabindex="3" />
</p>
<P id="buttons">
<input id="reset" type="reset" tabindex="4"> <input
id="submit" type="submit" tabindex="5" value="Add Employee">
</P>
</fieldset>
</form:form>
</div>
</body>
</html>
关于Spring的form标签的解释
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
使用Spring的form标签主要有两个作用,第一是它会自动的绑定来自Model中的一个属性值到当前form对应的实体对象,
默认是command属性,这样我们就可以在form表单体里面方便的使用该对象的属性了;
第二是它支持我们在提交表单的时候使用除GET和POST之外的其他方法进行提交,包括DELETE和PUT等
运行结果
当输入错误的日期格式
它会跳到同一表单,并提示错误
当输入正确的日期格式
跳到另一个表单,并显示信息