Struts2的主动类型转换及自定义类型转换

    添加时间:2013-7-25 点击量:

    转自:http://www.chinasb.org/archives/2010/11/850.shtml


    为什么会有类型转换? 


      HTTP和谈中传递的任何内容都是String类型的,所以一旦我们在办事器上须要一个非String类型的对象,例如:int或者Date,那么我
    们就须要在收到 HTTP恳求的数据的时辰,起首将String类型的数据变换为我们须要的对应类型的数据,之后再应用。这个过程就是类型转换 


    类型转换在Struts2中是透明的,即Struts2内置了类型转换机制。 


    一、概述 

      在B/S应用中,将字符串恳求参数转换为响应的数据类型,是MVC框架供给的功能,而Struts2是很好的MVC框架实现者,理所当然,供给了类型转换机制。 


      Struts2的类型转换是基于OGNL表达式的,只要我们把HTML输入项(表单位素和其他GET/POET的参数)定名为合法的OGNL表达式,就可以充沛哄骗Struts2的转换机制。 


     
      除此之外,Struts2供给了很好的扩大性,开辟者可以很是简单的开辟本身的类型转换器,完成字符串和自定义复合类型之间的转换。总
    之,Struts2的类型转换器供给了很是强大的发挥解析层数据处理惩罚机制,开辟者可以哄骗Struts2的类型转换机制来完成随便率性的类型转换。 


    二.常规类型的转换: 


      比如表单提交的信息有 用户名,诞辰, 春秋, Action中对应的数据类型分别是 String, Date, int.没什么好说的, Struts2会主动完成. 


      Struts2内建了常用的类型转换器,如String ,boolean,char,int,long,float,double,Date, 数组(假定元素是String类型), 凑集(假定元素是String类型,用ArrayList封装) 


    实现自定义类型转换器 

       实现TypeCoverter接口,或者持续DefaultTypeConverter实现类(该类实现了TypeCoverter接口),经由过程持续该实现类来实现本身的类型转换器。重写convertValue办法即可。 


      为了简化类型转换器的实现,Struts2供给了一个StrutsTypeConverter抽象类,这个抽象类是DefaultConverter的子类。实现了办法,并供给了2个不合转换标的目标的办法:Object 

    convertToString(Map context,String[] values,Class toClass)和String convertFromString(Map context,Object o)。 


    三、注册应用 

       实现了自定义类型转换器之后,将该类型转换器注册在Web应用中,Struts2框架才可以正常应用该类型转换器。 

    关于类型转换器的注册体式格式,首要有3中: 

    A、注册局部类型转换器:仅仅对某个Action的属性起感化。 

    B、注册全局类型转换器:对所有Action的特定类型的属性都邑生效。 


    1、局部类型转换器 

    供给如下格局的文件 

    文件名:  ActionName-conversion.properties  

    内容:多个propertyName(属性名)=类型转换器类(含包名),如  date=com.aumy.DateConverter 

    存放地位:和ActionName类雷同路径。 


    2、全局类型转换器 

    供给如下格局的文件 

    文件名:  xwork-conversion.properties 

    内容:   多个“复合类型=对应类型转换器”项构成,如  java.Util.Date=com.aumy.DateConverter 

    存放地位:WEB-INF/classes/目次下。 


    四、应用示例 

        因为Struts2对日期转换显示时,会显示日期和时候,如今项目只须要显示日期,所以采取自定义的类型转换器来实现日期显示。 


    1、类型转换类



    package com.cczjjg.util;
    

    import java.text.;
    import java.util.Date;
    import java.util.Map;
    import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;

    public class DateTypeConverter extends DefaultTypeConverter {

    private static final DateFormat[] ACCEPT_DATE_FORMATS = {

    new SimpleDateFormat(dd/MM/yyyy),

    new SimpleDateFormat(yyyMMdd),

    new SimpleDateFormat(yyyy-MM-dd),

    new SimpleDateFormat(yyyy/MM/dd) }; // 支撑转换的日期格局

    public Object convertValue(Map context, Object value, Class toType) {

    if (toType == Date.class) { // 浏览器向办事器提交时,进行String to Date的转换

    Date date
    = null;

    String dateString
    = null;

    String[] params
    = (String[]) value;

    dateString
    = params[0];// 获取日期的字符串

    for (DateFormat format : ACCEPT_DATE_FORMATS) {

    try {

    return format.parse(dateString);// 遍历日期支撑格局,进行转换

    }
    catch (Exception e) {

    continue;

    }

    }

    return null;

    }
    else if (toType == String.class) { // 办事器向浏览器输出时,进行Date to String的类型转换

    Date date
    = (Date) value;

    return new SimpleDateFormat(yyyy-MM-dd).format(date);// 输出的格局是yyyy-MM-dd

    }

    return null;

    }

    }




     

    2. 具体注册应用 

    局部设备: 

    ActionName-conversion.properties设备文件 








    1




    读书,不要想着实用,更不要有功利心。读书只为了自身的修养。邂逅一本好书如同邂逅一位知己,邂逅一个完美之人。有时心生敬意,有时怦然心动。仿佛你心底埋藏多年的话,作者替你说了出来,你们在时光深处倾心相遇的一瞬间,情投意合,心旷神怡。
    分享到: