Struts2之类型转换

jsp提交的数据全部是String类型,Struts2也是通过request.getParameter(name)取得String类型的数据,并通过拦截器将String转换成各种类型的数据,然后通过get、set方法设置到action对应的属性,默认的转换器不能满足需求,需要自定义类型转换。

数据类型转换都需要实现ognl.TypeConverter接口,一般直接继承DefaulrTypeConverter类,并实现convertValue()方法。convertvalue()有3个参数,参数value为待转换的数据,参数toType为要转成的类型,参数context为上下文,参数value为request.getparameter(name)返回的String[]类型的对象,而不是String。类型转换分为两类:局部类型转换器:对某个action转换类型起作用。全局类型转换器:对所有action转换类型起作用.

一、局部类型转换

1.1 普通Action中的类型转换
配置文件存放目录:Action同级目录;
配置文件名:Action名-conversion.properties文件
转换器:自定义转换器实现TypeConverter接口,可以直接继承StrutsTypeConverter来实现;
内容:Action属性名=转换器包路径

1.2 基于模型驱动的类型转换
配置文件存放目录:模型同级目录;
配置文件名:模型名-conversion.properties文件
转换器:自定义转换器实现TypeConverter接口,可以直接继承StrutsTypeConverter来实现;
内容:模型属性名=转换器包路径

二、全局类型转换
配置文件存放目录:项目根目录;
配置文件名:work-conversion.properties文件
转换器:自定义转换器实现TypeConverter接口,可以直接继承StrutsTypeConverter来实现;
内容:要转换的类型包路径=转换器包路径
注意:若在模型驱动情况下,即配置了Action的类型转换器又配置了对应模型的转换器,此时只会选择模型转换器;

三、实现

1.不管是局部还是全局类型转换,转换器都是一样的,只是配置文件不一样,所以先实现转换器,这里还是以MyStruts2为基础。

package com.test.converter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Map;

import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
import com.sun.org.apache.xerces.internal.impl.xpath.regex.ParseException;

public class DateTimeConverter extends DefaultTypeConverter {

    private DateFormat[] dateFormat={
            new SimpleDateFormat("yyyy-MM-dd"),
            new SimpleDateFormat("yyyy/MM/dd"),
            new SimpleDateFormat("yy-MM-dd")
    };
    private DateFormat[] timeFormat={
            new SimpleDateFormat("HH:mm:ss"),
            new SimpleDateFormat("HH:mm"),
    };
    @Override
    public Object convertValue(Map<String, Object> context, Object value, Class toType) {
        if(toType.equals(java.sql.Date.class))
        {
            String[]parameterValues=(String[])value;
            for(DateFormat format:dateFormat)
            {
                try{
                    return new java.sql.Date(format.parse(parameterValues[0]).getTime());
                
                }
                catch(ParseException e){} catch (java.text.ParseException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        else if(toType.equals(java.sql.Time.class))
        {
            String[]parameterValues=(String[])value;
            for(DateFormat format:timeFormat)
            {
                try{
                    return new java.sql.Time(format.parse(parameterValues[0]).getTime());
                
                }
                catch(ParseException e){} catch (java.text.ParseException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        else if(toType.equals(java.util.Date.class))
        {
            String[]parameterValues=(String[])value;
            for(DateFormat format:dateFormat)
            {
                try{
                    return format.parse(parameterValues[0]);
                
                }
                catch(ParseException e){} catch (java.text.ParseException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        else if(toType.equals(String.class))
        {
            if(value instanceof java.sql.Date){
                return dateFormat[0].format((java.sql.Date)value);
            }
            else if(value instanceof java.sql.Time)
            {
                return timeFormat[0].format((java.sql.Time)value);
            }
            else if(value instanceof java.util.Date)
            {
                return dateFormat[0].format((java.util.Date)value);
            }
        }
        return super.convertValue(context, value, toType);
    }

}
View Code

2.配置

普通Action中的类型转换:user.birthDay=com.test.converter.DateTimeConverter

基于模型驱动的类型转换:birthDay=com.test.converter.DateTimeConverter

全局类型转换:java.util.Date=com.test.converter.DateTimeConverter

这里还是新增一个User,时间格式是/也是能输出

posted @ 2017-03-25 22:30  社会主义接班人  阅读(237)  评论(0编辑  收藏  举报