struts2類型轉換器

Struts2自定義類型轉換器分爲局部類型轉換器和全局類型轉換器

ognl的api地址: http://www.opensymphony.com/ognl/api/

ognl源碼在網上自行下載,我是在csdn裏下的

 

1.      struts2內部支持的類型轉換

參考

http://ejb3.blogbus.com/logs/22922214.html

http://www.cnblogs.com/wushiqi54719880/archive/2011/07/09/2101773.html

 

可自動轉換的類型:

8個基本類型,Date(本地格式yyyy-MM-dd),array數組,List,Map類, set類

bean.firstname 賦值給Action中屬性名爲bean對象的firstname屬性

friends['patrick'].name 賦值給Map對象裏key爲'patrick' 的對象的name屬性

friends['patrick'] 賦值給Map對象裏key爲'patrick' 的值

注意:使用集合時,要注意使用泛型,如果不使用泛型,要額外寫配置文件.這裏不做詳述

參考http://hi.baidu.com/sqzhangling/item/b951bf8e39840e29100ef312

 

2.      自定義類型轉換器

類型轉換器的寫法:

 

寫一個類,類的要求: 實現TypeConverter接口或繼承DefaultTypeConverter類或繼承StrutsTypeConverter,然後覆蓋類中的方法.

org.apache.struts2.util.StrutsTypeConverter是

com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter的子類,

DefaultTypeConverter是 TypeConverter的實現類

 

如果是繼承DefaultTypeConverter,重寫convertValue方法, 該方法介紹如下:

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

context: context under which the conversion is being done

value: an object to be converted to the given type

totype: class type to be converted to

return: converted value of the type given, or value ifthe value cannot be converted to the given type.

這個方法轉換是雙向的,例如頁面上<s:textfield name=”user”/>對應action中的user屬性:

那麼表單元素string->user的轉換:if(toType==User.class){value轉換成String[],得到第1個元素,封裝成User對象,返回user };表單回填時從user->string的轉換: if(value instanceof User){return 字符串}

代碼參考 http://blog.csdn.net/furongkang/article/details/6921440

 

如果是繼承StrutsTypeConverter類,重寫convertFromString方法和convertToString方法,從方法名字就知道一個是從對象到字符串,一個是從字符串到對象.比上面的類更簡單,推薦是用這種.

/**

 * 日期類型轉換器

 */

publicclass DateTypeConversion extends StrutsTypeConverter{

   publicstaticfinal String dateType="yyyy/MM/dd";

   publicstaticfinal SimpleDateFormat format=new SimpleDateFormat(dateType);

   /**

    * 從表單到Action中屬性的轉換

    */

   @Override

   public Object convertFromString(Map context, String[] values, Class toType) {

        if(toType==java.util.Date.class){

              try {

                    if(!””.equals(values[0].trim()))

                    returnformat.parse(values[0]);

              } catch (ParseException e) {

                    e.printStackTrace();

              }

        }

        returnnull;

   }

 

   /**

    * Action某屬性轉換成字符串

    */

   @Override

   public String convertToString(Map context, Object value) {

        if(value instanceof java.util.Date){

              returnformat.format((java.util.Date)value);

        }

        returnnull;

   }

}

 

a)        局部類型轉換器,

  在action類所在的包下新建ActionClassName-conversion.properties文件,ActionClassName是類名,後面的-conversion.properties是固定的寫法,
  如:HelloWorldAction-conversion.properties
  properties文件裏面的內容爲:屬性名稱=類型轉換器的全類名(既包名.類名)
  如:birthday=com.ljq.type.converter.DateTypeConverter

b)        全局類型轉換

將上面的類型轉換器註冊成全局類型轉換器,在src下新建文件:xwork-conversion.properties ,名稱是固定的,內容格式:java.util.Date=cn.itcast.converter.DateTypeConverter

 

還有關於基於註解的類型轉換器和上面的原理相同,在struts2的註解裏再介紹,也可先參考:

http://blog.sina.com.cn/s/blog_883da5580100w3bt.html

http://blog.csdn.net/xiaoping8411/article/details/4775936

 

3.      struts2類型轉換錯誤處理

要求Action類繼承ActionSupport,否則無法添加錯誤信息!

struts2-default.xmlpackage name="struts-default"的裏面可以找到


<interceptor-stack name="defaultStack">裏有對上面這個攔截器的引用,如果轉換失敗,例如攔截器裏有異常拋出,那麼struts2會把錯誤信息封裝成fielderror放入ActionContext,然後默認進入名爲input的視圖.

 

錯誤信息的國際化:

如果是自定義的轉換器,某個Action特定屬性轉換失敗:ActionName_zh_CN.properties國際化資源文件中寫

invalid.fieldvalue.屬性名=提示信息即可

 

如果是struts2默認的類型轉換器,要改變轉換失敗後的英文提示信息,那麼在全局國際化資源文件中寫:

xwork.default.invalid.fieldvalue={0}字段類型轉換失敗!

 

4.      struts2中怎麼設置日期類型的格式

 

struts.date.format=yyyy-MM-dd只能控制<s:date>標籤中format屬性的默認值

所以需要自己寫日期類型轉換器來實現,自定義的格式

全局的:java.util.Date=converter.MyDateDefaultTypeConverter

或局部的user.opTime=converter.MyDateDefaultTypeConverter

在頁面上顯示時可以使用<s:properties value=”birthday”/>標籤,填寫時也要寫成自定義的格式

發佈了46 篇原創文章 · 獲贊 26 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章