`
softstone
  • 浏览: 477794 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

关于编写类型转换器

阅读更多

struts2不支持String到Calendar的转换,参考了一下xwork的源码,想自己写一个。嫌麻烦,还是直接转到java.util.Date吧。把xwork的源代码贴一下,以后写别的转换器时可以参考。 

 

public class XWorkBasicConverter extends DefaultTypeConverter ...{

    
private static String MILLISECOND_FORMAT = ".SSS";
    
final private static SimpleDateFormat RFC3399_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    ......
}

 必须继承自ognl.DefaultTypeConverter这个类;两个常量在做Date转换时会用到,就贴上来了。

完整的从String转换到Date的函数,支持java.sql.Time, java.sql.Timestamp, java.util.Date,简单更改一下即可支持Calendar。

    private Object doConvertToDate(Map context, Object value, Class toType) ...{
        Date result 
= null;

        
if (value instanceof String && value != null && ((String)value).length() > 0...{
            String sa 
= (String) value;
            Locale locale 
= getLocale(context);

            DateFormat df 
= null;
            
if (java.sql.Time.class == toType) ...{
                df 
= DateFormat.getTimeInstance(DateFormat.MEDIUM, locale);
            }
 else if (java.sql.Timestamp.class == toType) ...{
                Date check 
= null;
                SimpleDateFormat dtfmt 
= (SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.SHORT,
                        DateFormat.MEDIUM,
                        locale);
                SimpleDateFormat fullfmt 
= new SimpleDateFormat(dtfmt.toPattern() + MILLISECOND_FORMAT,
                        locale);

                SimpleDateFormat dfmt 
= (SimpleDateFormat) DateFormat.getDateInstance(DateFormat.SHORT,
                        locale);

                SimpleDateFormat[] fmts 
= ...{fullfmt, dtfmt, dfmt};
                
for (int i = 0; i < fmts.length; i++...{
                    
try ...{
                        check 
= fmts[i].parse(sa);
                        df 
= fmts[i];
                        
if (check != null...{
                            
break;
                        }

                    }
 catch (ParseException ignore) ...{
                    }

                }

             }
 else if(java.util.Date.class == toType) ...{
                Date check 
= null;
                SimpleDateFormat d1 
= (SimpleDateFormat)DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.LONG, locale);
                SimpleDateFormat d2 
= (SimpleDateFormat)DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM, locale);
                SimpleDateFormat d3 
= (SimpleDateFormat)DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, locale);
                SimpleDateFormat[] dfs 
= ...{d1, d2, d3, RFC3399_FORMAT}//added RFC 3339 date format (XW-473)
                for (int i = 0; i < dfs.length; i++...{
                    
try ...{
                        check 
= dfs[i].parse(sa);
                        df 
= dfs[i];
                        
if (check != null...{
                            
break;
                        }

                    }

                    
catch (ParseException ignore) ...{
                    }

                }

            }

            
//final fallback for dates without time
            if (df == null)...{
                df 
= DateFormat.getDateInstance(DateFormat.SHORT, locale);
            }

            
try ...{
                df.setLenient(
false); // let's use strict parsing (XW-341)
                result = df.parse(sa);
                
if (! (Date.class == toType)) ...{
                    
try ...{
                        Constructor constructor 
= toType.getConstructor(new Class[]...{long.class});
                        
return constructor.newInstance(new Object[]...{new Long(result.getTime())});
                    }
 catch (Exception e) ...{
                        
throw new XWorkException("Couldn't create class " + toType + " using default (long) constructor", e);
                    }

                }

            }
 catch (ParseException e) ...{
                
throw new XWorkException("Could not parse date", e);
            }

        }
 else if (Date.class.isAssignableFrom(value.getClass())) ...{
            result 
= (Date) value;
        }

        
return result;
    }

 

完成转换的函数:

public Object convertValue(Map context, Object o, Member member, String s, Object value, Class toType) ...{
        Object result 
= null;

        
if (value == null || toType.isAssignableFrom(value.getClass())) ...{
            
// no need to convert at all, right?
            return value;
        }


        
if (toType == String.class...{
            result 
= doConvertToString(context, value);
        }
 else if (toType == boolean.class...{
            result 
= doConvertToBoolean(value);
       &n
分享到:
评论

相关推荐

    传智播客struts2.1源代码_自定义类型转换器

    当默认的类型转换器无法满足特定需求时,开发者可以编写自定义类型转换器。自定义类型转换器需要实现`org.apache.struts2.util.TypeConverter`接口,或者继承`org.apache.struts2.convention.converters....

    自定义类型转换器

    自定义类型转换器是当Struts2内置的转换器无法满足特定业务需求时,开发者自行创建的一种扩展方式。然而,这里提到的"自定义类型转换器"实际上与权限控制有关,而非类型转换。描述中的内容主要涉及的是如何实现用户...

    自己写的转换器,包含各种基本的数据类型。

    标题中提到的“自己写的转换器”很可能就是针对Struts1框架的一个自定义类型转换器实现。这样的转换器能够帮助开发者更方便地处理不同数据类型的转换工作,尤其是在处理用户表单提交的数据时,可以将前端传入的字符...

    struts2自定义类型转换器

    以上就是关于Struts2自定义类型转换器的详细说明,通过这样的转换器,我们可以将用户输入的坐标值字符串有效地转换为`int`类型的坐标对象,从而满足业务需求。在实际开发中,我们可以根据不同的场景,编写各种自定义...

    struts 2.0 自定义类型转换器 注册类型转换器 入门实例 简单实例

    当我们需要对默认类型转换器的功能进行扩展或者处理自定义类型时,就需要自定义类型转换器。 自定义类型转换器是Struts 2的核心特性之一,允许开发者根据业务需求定制数据转换规则。以下将详细介绍如何创建、注册...

    C,C++ To Delphi转换器(源码)

    5. **文档**:可能包括README、USER_GUIDE或CHANGES等文件,提供关于如何使用转换器、注意事项以及版本变更的信息。 6. **测试用例**:一组源代码文件,用于验证转换器的正确性。 使用这种转换器时,开发者需要注意...

    通用公式转换器V2.3.

    通用公式转换器V2.3是一款强大的工具,主要用于处理各种数学、科学以及工程领域的公式转换。这个软件的主要功能是将一种表示方式的公式转化为另一种,可能是为了适应不同的计算环境、编程语言或者显示需求。在IT行业...

    struts2全局转换的问题

    Struts2是一个非常流行的...总的来说,理解和解决Struts2全局转换问题需要对框架有深入的理解,包括其配置机制、转换器的原理以及如何编写和注册自定义转换器。同时,熟悉相关开发工具和源码阅读能力也是必不可少的。

    FME 2014转换器手册

    若需了解更多关于这类转换器的信息,用户应联系SafeSoftware公司。 - **N符号**:指示了本版本中新增加的转换器。 - **转换器分类概述**: - **3D.1**:涉及三维表面和实体几何的创建与修改。 - **计算1**:用于...

    Cxf转换器示例

    【Cxf转换器示例】是一个关于Web服务技术的实践项目,主要聚焦于Apache CXF框架中的转换器(Converter)功能。Apache CXF是一个开源的Java框架,它用于构建和开发服务导向架构(SOA)和RESTful应用程序。CXF不仅支持...

    D转换器的设计与实现

    三斜积分式A/D转换器相比于其他类型的积分式转换器,具有更高的线性度和更好的稳定性。这种类型的转换器特别适用于需要高精度测量的应用场景。在设计过程中,如何精确地控制积分过程成为提高转换精度的关键。 #####...

    JSF 转换器视频

    在"Jsf第六章.wrf"这个视频文件中,讲师很可能会演示如何在Myeclipse中创建一个简单的JSF项目,设置好环境后,他会逐步解释转换器的概念,编写一个自定义转换器的示例,展示如何注册和使用这个转换器,最后通过实际...

    C#编写项目编码格式转换器

    标题 "C#编写项目编码格式转换器" 涉及的是使用C#编程语言开发一个工具,该工具能够处理文本文件的字符编码转换。在软件开发中,不同的文本文件可能采用不同的编码方式,如ASCII、UTF-8、GBK等,这可能导致在不同...

    图片格式转换器1.0版.rar

    【描述】:“图片格式转换器1.0版.rar”描述简明,它强调了这个软件是关于图片格式转换的,且是其初始版本1.0。通常,这样的工具会支持常见的图像格式如JPEG、PNG、BMP、GIF等之间的相互转换。 【标签】:“图片...

    数据库转换器 .db数据库

    数据库转换器是一款专门用于处理.db数据库文件的工具,它的主要功能是将.db格式的数据转换成其他类型的数据库格式,或者从其他格式导入到.db数据库中。.db文件通常是由SQLite数据库管理系统创建的,这是一种轻量级、...

    单片机数字电压表ad转换器

    常见的AD转换器类型包括逐次逼近型、双积分型、Σ-Δ型等。在本设计中,AD转换器的精度、分辨率和转换速率对电压测量的准确性和实时性至关重要。例如,一个12位的AD转换器能提供4096个不同的数字输出,对应于0到Vref...

    C#写的日历转换器 阴阳历转换

    本篇文章将深入探讨一个由C#语言编写的日历转换器,该转换器特别针对基于PXA270目标板的环境,并使用了Visual Studio 2005(需预先安装SDK)。 首先,我们要理解C#在构建此类应用程序中的核心作用。C#是一种面向...

    基于单片机与数模转换器的仿真实例下载

    3. 数模转换器的工作原理和常见类型,如线性DAC和积分型DAC。 4. 如何配置和控制数模转换器,包括设置参考电压、选择输出范围等。 5. 数模转换器与单片机之间的通信协议,如SPI、I2C或并行接口。 6. 数模转换器在...

    tabgible多种语言转换器,可转换

    "tabgible多种语言转换器"是一款强大的编程语言转换工具,能够帮助开发者将源代码从一种编程语言转化为另一种。这个转换器支持的语言包括C++、C#、Java和VB(Visual Basic),这使得它在跨平台开发或者在不同技术栈...

Global site tag (gtag.js) - Google Analytics