zoukankan      html  css  js  c++  java
  • 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,时间格式是/也是能输出

  • 相关阅读:
    iOS $299刀企业证书申请的过程以及细节补充
    关于移动开发的一些想法和认识--Android和iOS
    iOS设备的越狱方法
    iOS越狱开发(一)
    iOS开发中 workspace 与 static lib 工程的联合使用
    高效 Java Web 开发框架 JessMA v3.5.1
    跨平台日志清理工具 Log-Cutter v2.0.1 正式发布
    【新年呈献】高性能网络通信框架 HP-Socket v5.7.1
    高性能网络通信框架 HP-Socket v5.2.1
    跨年呈献:HP-Socket for Linux 1.0 震撼发布
  • 原文地址:https://www.cnblogs.com/5ishare/p/6618814.html
Copyright © 2011-2022 走看看