自定义日期类型转换

微笑、不失礼 提交于 2020-01-16 13:22:23

struts中提供一个自定义类型的转换,比如这里面的日期,默认转换2019-9-12,如果写成2019/9/12则会报错

  1. struts的字符串类型转换是由一个类com.opensymphony.xwork2.conversion.impl.StringConverter类来完成的
  2. 日期类型转换是由com.opensymphony.xwork2.conversion.impl.DateConverter来完成

所以如果自己想修改转换格式的话,可以自定义一个转换器

源码分析得出,如果要自己写一个类型转换

  1. 可以实现DefaultTypeConverter抽象类
  2. 我们一般也可以用它的子类StrutsTypeConverter来实现

写一个MyDateConverter,测试一下这里面的方法参数分别为什么东西

package convert;

import org.apache.struts2.util.StrutsTypeConverter;

import java.util.Map;

public class MyDateConverter extends StrutsTypeConverter {
    /**
     * 将字符串转化为对象类型
     * @param map
     * @param strings
     * @param aClass
     * @return
     */
    @Override
    public Object convertFromString(Map map, String[] strings, Class aClass) {
        System.out.println(aClass);
        for (String s:strings) {
            System.out.println(s);
        }

        return null;
    }

    /**
     * 将对象类型转化为字符串
     * @param map
     * @param o
     * @return
     */
    @Override
    public String convertToString(Map map, Object o) {
        return null;
    }
}

然后在模型包下面创建一个配置文件,命名为  : 模型名-conversion.properties

上面那个是默认的struts规定的转换器配置文件格式,配置文件中写想要转换的模型中的属性,以及依赖的转换器

birthday=convert.MyDateConverter

这里面的birthday是User里面的一个属性

启动服务器,提交表单数据,查看控制台,发现输出如下:

class java.util.Date
2019/2/4
User{username='hh', password='123', birthday=null, hobby='唱歌,code', married=false}

由输出来看这里的aClass是目的转换类型所依赖的类

第二行是待转换的数据

第三行中birthday为null,是因为这里面的转换器的转换方法,返回的值为null

下面演示如何自定义一个转换器,将自定义格式的字符串转化为Date类型的

package convert;


import org.apache.struts2.util.StrutsTypeConverter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Map;

public class MyDateConverter extends StrutsTypeConverter {
    /**
     * 将字符串转化为对象类型
     * @param map
     * @param strings
     * @param aClass
     * @return
     */
    @Override
    public Object convertFromString(Map map, String[] strings, Class aClass) {
        if (strings!=null&&strings.length>0){
            //取数据
            String dateStr=strings[0];
            if ("".equals(dateStr)){
                return null;
            }

            //转换
            SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd");
            try {
                return sdf.parse(dateStr);
            } catch (ParseException e) {
                e.printStackTrace();
                throw new RuntimeException(e);//转换异常
            }
        }

        return null;
    }

    /**
     * 将对象类型转化为字符串
     * @param map
     * @param o
     * @return
     */
    @Override
    public String convertToString(Map map, Object o) {
        return null;
    }
}

在这里面为了使项目中所有Date类型的数据转换器全依靠这个转换器,可以在src的根路径下面创建一个配置文件xwork-conversion.properties,在配置文件中写:

java.util.Date=convert.MyDateConverter

这样就使得全局中的Date类型数据转化都使用这个转换器

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!