對于moxie的"WebWork教程"補充 - [類型轉化]
moxie的WebWork教程 ( http://forum.javaeye.com/viewtopic.php?t=5964 ) 非常詳細,但是好像還缺少了webwork其他一些很有特色的東西,我在這里補充一些上來,首先是類型轉化:
我們知道由于HTTP協議只能傳遞String,如果后臺的Java模型使用了其他類型的屬性,必須得做一些轉化工作,而這些轉化代碼通常卻是繁瑣而又無聊,WebWork提供了Type Conversion功能,能夠讓我們從這些代碼中解脫出來。
看一個例子,
一個Person對象,有一個出生日期的屬性:
一個Action對Person做操作:
我們通常在頁面上會限制這個日期的格式(比如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 )
那么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
結論:靈活使用轉換器可以減少我們那些繁瑣無聊的類型轉化代碼。
我們知道由于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
結論:靈活使用轉換器可以減少我們那些繁瑣無聊的類型轉化代碼。