SpringMVC之转换器和格式化

来源:互联网 发布:淘宝海外直购 编辑:程序博客网 时间:2024/05/20 07:35

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

@Controllerpublic 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等

运行结果

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

原创粉丝点击