欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring mvc实战系列教程(6)--处理日期转换

程序员文章站 2022-04-07 21:18:29
...

     Java有各种数据类型,但页面传到服务端的数据通常都是字符串型的,springmvc对常用的基本数据类型做了自动类型转换,但对于日期类型,由于日期格式多种多样,所以spring mvc无法统一处理,看下面的例子:

      /**
 *
 * @author 演示常用客户端参数接收方式
 *
 */
@Controller
@RequestMapping("/paramPassDemo")
public class ParamPassDemo {

  /**
     * 使用领域对象来接收参数
     *
     * @param user
     * @return
     */
    @RequestMapping("/queryStringWithDomainObj")
    public String test3(User user) {
        System.out.println("用户名为:" + user.getUserName() + ",密码为:" + user.getUserPass() + "年龄为:" + user.getAge()+",生日为:"+user.getBirthday());
        return "NewFile";
    }
}

      这里使用领域对象User来自动接收页面传来的参数,领域对象的属性为:

public class User implements Serializable{
    private String userName;
    private String userPass;
    private Integer age;
 
    private Date birthday;

    getters &setters...}

 其中包含一个java.util.Date类型的属性birthday,其他属性均属可以自动转换的类型。直接在客户端浏览器访问会发生400异常,表示请求格式有误,原因就是不能把形如11-21-1998或其他格式日期字符串自动转成java的Date类型

http://localhost:8080/abc/paramPassDemo/queryStringWithDomainObj?userName=%E5%BC%A0%E4%B8%89&userPass=123&birthday=11-21-1998&age=45

 

解决方案如下:

1.局部方式

使用Spring MVC注解org.springframework.format.annotation.DateTimeFormat标注到需要转换的属性上,如:

@DateTimeFormat(pattern="MM-dd-yyyy")
    private Date birthday;

再次访问,spring mvc的controller即可自动转换并接收

 

2. 全局方式

如果需要转换的日期字段很多,并且可以确定格式统一,那么使用局部方式就比较繁杂枯燥,这时可以使用spring mvc提供的全局转换器converter一起解决,步骤如下:

1)创建自定义日期转换器类实现org.springframework.core.convert.converter.Converter接口并重写其

T convert(S source);方法,该方法入参为传入的类型,出参(返回类型)为希望转换后的类型,比如这里我们希望将接受到的String类型的日期字符串转换为java.util.Date类型,那么就这样写:

public class DateConverter implements Converter<String, Date> {   
   
    @Override
    public Date convert(String source ) {
        //获取日期格式化类,支持多种时间格式
        SimpleDateFormat sdf = getSimpleDateFormat(source);
        try {
            Date date = sdf.parse(source);
            return date;
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
 
    private SimpleDateFormat getSimpleDateFormat( String source ) {
        SimpleDateFormat sdf = new SimpleDateFormat();
        if( Pattern.matches("^\\d{4}-\\d{2}-\\d{2}$", source )) {
            sdf = new SimpleDateFormat("yyyy-MM-dd");
        }
        else if(Pattern.matches("^\\d{2}-\\d{2}-\\d{4}$", source )){
            sdf = new SimpleDateFormat("MM-dd-yyyy");
        }
        else {
            System.out.println("日期格式错误");
        }
        return sdf;
    }
}

私有的工具方法用于支持多种日期格式。

 

2)在spring mvc配置文件中增加对自定义日期转换器的声明

<bean id="conversion-service"
        class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.khbr.springmvcdemo.converter.DateConverter" />
            </set>
        </property>
    </bean>

可以看到,springmvc提供的转换工厂bean(ConversionServiceFactoryBean)可以支持多种converter

 

3)在spring mvc配置文件的mvc:annotation-driven节点中增加conversion-service属性,执行刚才定义的ConversionServiceFactoryBean的id

<mvc:annotation-driven conversion-service="conversion-service">

 

       再次测试同样的请求(注意测试前将局部的@DateTimeFormat注解去掉),可以看到效果跟单独在字段上使用@DateTimeFormat注解一样,并且可以支持多种格式(请变换请求格式自行测试)。

     当然,如果使用json为前后端交换格式,可以使用jackson之类的框架进行配置,这也是一种全局配置,我们后面再讨论。