随笔 - 3, 文章 - 152, 评论 - 17, 引用 - 0
数据加载中……

对于moxie的"WebWork教程"补充 - [类型转化]

moxie的WebWork教程 ( http://forum.javaeye.com/viewtopic.php?t=5964 ) 非常详细,但是好像还缺少了webwork其他一些很有特色的东西,我在这里补充一些上来,首先是类型转化:

我们知道由于HTTP协议只能传递String,如果后台的Java模型使用了其他类型的属性,必须得做一些转化工作,而这些转化代码通常却是繁琐而又无聊,WebWork提供了Type Conversion功能,能够让我们从这些代码中解脱出来。

看一个例子,

一个Person对象,有一个出生日期的属性:
java代码: 


public class Person {
    private Date dateOfBirth;
}



一个Action对Person做操作:
java代码: 


public class CreatePerson implements Action {
    private Person person;
   
    public String execute() throws Exception {
        //Do some work
        //...
        return SUCCESS;
    }

}



我们通常在页面上会限制这个日期的格式(比如yyyy-MM-dd),通过写一个WebWork的转化器,我们就可以把在页面上:<input type="text" name="person.dateOfBirth" value="1949-10-01"/> 这样的值直接变成了相应的Date对象。

转换器需要扩展ognl.DefaultTypeConverter (在webwork2.1.6以后,我们可以扩展WebWorkTypeConverter这个对象,更新的代码可以参考这个: http://cvs.javaeye.com:8008/quake/getfile/jert/src/java/com/javaeye/core/webwork/converter/DateConverter.java?v=1.2 )
java代码: 


public class DateConverter extends DefaultTypeConverter {
    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    public Object convertValue(Map ognlContext, Object value, Class toType) {
        Object result = null;
        if (toType == Date.class) {
            result = doConvertToDate(value);
        } else if (toType == String.class) {
            result = doConvertToString(value);
        }
        return result;
    }

    private Date doConvertToDate(Object value) {
        Date result = null;

        if (value instanceof String) {
            try {
                result = sdf.parse((String) value);
            } catch (ParseException e) {
                throw new XworkException("Could not parse date", e);
            }
        } else if (value instanceof Object[]) {
            // let's try to convert the first element only
            Object[] array = (Object[]) value;
            if ((array != null) && (array.length >= 1)) {
                value = array[0];
                result = doConvertToDate(value);
            }
        } else if (Date.class.isAssignableFrom(value.getClass())) {
            result = (Date) value;
        }
        return result;
    }

    private String doConvertToString(Object value) {
        String result = null;
        if (value instanceof Date) {
            result = sdf.format(value);
        }
        return result;
    }
}



那么WebWork是如何知道要使用这个转化器对Person的dateOfBirth做转化呢?我们有2种方法:
1. Class-specific conversion rules
写一个className-conversion.properties,这上面的例子里,我们就在Person.java所在的package下面,写一个Person-conversion.properties
在这个文件里面指定:
dateOfBirth=com.javaeye.core.webwork.converter.DateConverter

2. Application-wide conversion rules
在classpath root下面写一个xwork-conversion.properties:
java.util.Date=com.javaeye.core.webwork.converter.DateConverter

这样一旦写好了一个转换器以后,就能够很方便地被重用了,在这篇wiki里面,有更加详细的介绍: http://wiki.opensymphony.com/display/XW/Type+Conversion

再举一个实际的例子:
在jert里面,我们希望可以给用户选择多语言,那么我们在页面上提供了一个下拉列表,选项有zh_CN和en_US,通过一个LocaleConverter,我们就可以直接把String转化成Locale对象:

http://cvs.javaeye.com:8008/quake/getfile/jert/src/java/com/javaeye/core/webwork/converter/LocaleConverter.java?v=1.1

结论:灵活使用转换器可以减少我们那些繁琐无聊的类型转化代码。

posted on 2005-03-05 22:20 阅读(317) 评论(0)  编辑  收藏 所属分类: J2ee


只有注册用户登录后才能发表评论。


网站导航: