隨筆 - 3, 文章 - 152, 評論 - 17, 引用 - 0
          數(shù)據(jù)加載中……

          對于moxie的"WebWork教程"補(bǔ)充 - [類型轉(zhuǎn)化]

          moxie的WebWork教程 ( http://forum.javaeye.com/viewtopic.php?t=5964 ) 非常詳細(xì),但是好像還缺少了webwork其他一些很有特色的東西,我在這里補(bǔ)充一些上來,首先是類型轉(zhuǎn)化:

          我們知道由于HTTP協(xié)議只能傳遞String,如果后臺的Java模型使用了其他類型的屬性,必須得做一些轉(zhuǎn)化工作,而這些轉(zhuǎn)化代碼通常卻是繁瑣而又無聊,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的轉(zhuǎn)化器,我們就可以把在頁面上:<input type="text" name="person.dateOfBirth" value="1949-10-01"/> 這樣的值直接變成了相應(yīng)的Date對象。

          轉(zhuǎn)換器需要擴(kuò)展ognl.DefaultTypeConverter (在webwork2.1.6以后,我們可以擴(kuò)展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是如何知道要使用這個轉(zhuǎn)化器對Person的dateOfBirth做轉(zhuǎn)化呢?我們有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

          這樣一旦寫好了一個轉(zhuǎn)換器以后,就能夠很方便地被重用了,在這篇wiki里面,有更加詳細(xì)的介紹: http://wiki.opensymphony.com/display/XW/Type+Conversion

          再舉一個實際的例子:
          在jert里面,我們希望可以給用戶選擇多語言,那么我們在頁面上提供了一個下拉列表,選項有zh_CN和en_US,通過一個LocaleConverter,我們就可以直接把String轉(zhuǎn)化成Locale對象:

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

          結(jié)論:靈活使用轉(zhuǎn)換器可以減少我們那些繁瑣無聊的類型轉(zhuǎn)化代碼。

          posted on 2005-03-05 22:20 閱讀(335) 評論(0)  編輯  收藏 所屬分類: J2ee

          主站蜘蛛池模板: 绥中县| 汕尾市| 福鼎市| 河池市| 临邑县| 高碑店市| 思茅市| 玉溪市| 藁城市| 义马市| 乌拉特前旗| 万年县| 天全县| 搜索| 肥西县| 黔西县| 财经| 新河县| 大安市| 虎林市| 睢宁县| 阳新县| 揭东县| 遵义县| 丹寨县| 富宁县| 通化市| 武定县| 上林县| 金堂县| 沙洋县| 鹿泉市| 许昌市| 股票| 和平县| 共和县| 汝州市| 疏勒县| 济宁市| 汉阴县| 宁强县|