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

Spring MVC自定义日期类型转换器实例详解

程序员文章站 2023-10-20 13:16:37
spring mvc自定义日期类型转换器实例详解  web层采用spring mvc框架,将查询到的数据传递给app端或客户端,这没啥,但是坑的是实体类中有日期类型的属性...

spring mvc自定义日期类型转换器实例详解

 web层采用spring mvc框架,将查询到的数据传递给app端或客户端,这没啥,但是坑的是实体类中有日期类型的属性,但是你必须提前格式化好之后返回给它们。说真的,以前真没这样做过,之前都是一口气查询到数据,然后在jsp页面上格式化,最后展示给用户。但是这次不同,这次我纯属操作数据,没有页面。直接从数据库拿数据给它们返数据、它们给我传数据我持久化数据,说到这里一个小问题就默默的来了。

首先把问题还原一下吧(这是一个数据导出功能),下图中用红框圈起来的都是直接从数据库中拿到的数据,但是不幸的是它们的对象中都包含日期类型的属性,然后我直接使用com.alibaba.fastjson.jsonobject将其转成json串返回给app端和客户端,但是他们拿到的数据中时间类型的值都是时间戳,很不人性化,我也觉的很不人性化,就答应给他们格式化一下,不料,问题来了,格式化好之后然后又设置进去,结果是没用,没用,没用,重要的事情说三遍!

Spring MVC自定义日期类型转换器实例详解

解决上面出现的问题,格式化对象中的日期类型的属性值,然后返回给请求者。记住:这个动作是在服务器端完成,并且实体类和数据表中的类型也都不变,照样是日期类型的。

第一步:首先自定义一个日期类型转换器(附代码)

package com.tgsit.cjd.utils;
/**
 * 日期类型转换器:
 *     自动格式化对象中的日期类型
 */
import java.text.simpledateformat;
import java.util.date;
import java.util.locale;
import net.sf.json.jsonconfig;
import net.sf.json.processors.jsonvalueprocessor;
public class jsondatevalueprocessor implements jsonvalueprocessor{
  private string format ="yyyy-mm-dd"; 
  public jsondatevalueprocessor() { 
    super(); 
  }  
  public jsondatevalueprocessor(string format) { 
    super(); 
    this.format = format; 
  } 
  @override 
  public object processarrayvalue(object paramobject, 
      jsonconfig paramjsonconfig) { 
    return process(paramobject); 
  } 
  @override 
  public object processobjectvalue(string paramstring, object paramobject, 
      jsonconfig paramjsonconfig) { 
    return process(paramobject); 
  }  
  private object process(object value){ 
    if(value instanceof date){  
      simpledateformat sdf = new simpledateformat(format,locale.china);  
      return sdf.format(value); 
    }  
    return value == null ? "" : value.tostring();  
  } 
}

第二步:如果项目中没有引入json-lib包,则引入

<dependency>
   <groupid>net.sf.json-lib</groupid>
   <artifactid>json-lib</artifactid>
   <version>2.4</version>
   <classifier>jdk15</classifier>
</dependency>

第三步:返回数据之前先使用日期类型转换器格式化日期数据

这里必须先创建jsonconfig对象,然后调用registerjsonvalueprocessor(date.class, new jsondatevalueprocessor());方法将转换器注入进去,最后在调用jsonarray的formobject(数据,new jsonconfig())方法进行处理。

注意:这里还有个小坑,就是当你处理的是单纯的一个实体对象,则直接可以jsonobject.formobject(数据,new jsonconfig());

但是你处理的一个list集合数据时,则记得用jsonarray.formobject(数据,new jsonconfig());否则报错。

@requestmapping(value = "/exportinfo", method = requestmethod.get)
  @responsebody
  public string exportinfo(httpservletresponse response) throws exception{
    list<queryvo> exportinfolist = queryvoservice.exportinfo();
    if(exportinfolist != null && exportinfolist.size() > 0){
      list<object> result = new arraylist<object>();
      jsonresult model = null;
      for (queryvo queryvo : exportinfolist) {
        ownerinfo ownerinfo = ownerinfoservice.selectownerinfobyvin(queryvo.getvin());
        list<mortgagerinfo> morinfolist = mortgagerinfoservice.selectbyvin(queryvo.getvin());
        list<transferinfo> trainfolist = transferinfoservice.selectbyvin(queryvo.getvin());
        model = new jsonresult();
        model.setownerinfo(ownerinfo);
        model.setmortgagerinfo(morinfolist);
        model.settransferinfo(trainfolist);
        result.add(model);
      }
      //调用自定义日期类型转换器,自动格式化对象中的日期类型的字段值
      jsonconfig jsonconfig = new jsonconfig(); 
      jsonconfig.registerjsonvalueprocessor(date.class, new jsondatevalueprocessor());
      return cgsconstants.returnjson(cgsconstants.success,"导出成功",jsonarray.fromobject(result, jsonconfig));
    }
    return cgsconstants.returnjson(cgsconstants.success,"尚无数据",null);
  }

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!