SpringMVC实战教程 | 第七篇:SpringMVC转换器和格式化

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等

运行结果

当输入错误的日期格式
这里写图片描述
它会跳到同一表单,并提示错误
这里写图片描述
当输入正确的日期格式
这里写图片描述
跳到另一个表单,并显示信息
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值