Struts2學習:類型轉換篇

框架中常規的類型轉換對我們而言是透明的,我們無需關心,一般來說我們所要做的是確保HTMLinput的命名能夠在OGNL表達式中使用。在HTML中,並沒有數據類型的概念,任何數據都被當做字符串或者字符串數組來傳遞。Struts2爲我們提供了一些內建的類型轉換,譬如說基本類型之間的轉換、”1984-08-27”格式的字符串能夠被正確的轉換爲Date類型等等。但是這些內建的類型轉換有時並不能滿足我們的需求,比方說,我們希望用戶輸入”3,32”格式的座標字符串時,Struts2能幫我們把這個String類型轉化成Point類型,這個時候我們就需要自定義一個類型轉換器。具體來說,整個過程可以分爲兩個步驟:

1.定義一個類型轉換類,需實現ognl.TypeConverter接口(文檔中無具體實例)

2.給需要進行轉換的類或屬性指定類型轉換器

上述第2步需要用到配置文件,根據作用域的不同可以將配置文件分爲兩種:類級別和全局級別。

1.類級別配置               

假設我是在MyAction這個action中要對它的Point類型的屬性point進行轉化,那麼我就需要創建一個名字爲MyAction-conversion.properties文件,內容如下:

point=com.acme.PointConverter

注意,等號右邊的內容應該是我們所定義的類型轉化器,這裏我們只是給出了一個樣例,並沒有真正創建這個類型轉換類。另外局部類型轉換配置文件遵循如下的命名規則:ClassName-conversion.properties

2.全局級別配置

classpath的根目錄下創建一個xwork-conversion.properties文件,加入如下內容:

com.acme.Point = com.acme.PointConverter

前後兩種配置,等候右邊的內容是一樣的,只是左右稍微不同。類級別時,左邊是類中需進行類型轉換的屬性的名稱;全局級別時,左邊是需進行類型轉化的類型的全名。

一.內建的類型轉換支持

XWork能夠自動的爲我們處理大多數常見的類型轉換,它能幫我們把字符串轉換爲下面的任意一種類型,也能把下面任意一個類型轉換爲字符串。這些類型如下所示:

      String

      boolean/ Boolean

      char/Character

      int/Integerfloat/Floatlong/Longdouble/Double

      dates----使用當前時區的SHORT格式

      arrays-----假設每個單獨的字符串都能轉換成數組中元素的類型

      collections-----如果不能確定集合中元素的類型,會默認是String類型,並創建一個新的ArrayList對象

    對數組進行轉換時,會順延至對數組中的每個元素進行轉換。和所有其它的類型轉換一樣,如果轉換無法完成需要使用一個標準的類型轉換錯誤報告來表明處理類型轉換時發生了問題。

二.創建一個類型轉換器

文檔中沒有給出具體的實例,只是給我們介紹了一個用於編寫類型轉換的幫助類。這個類是org.apache.struts.action2.util.StrutsTypeConverter,它能幫助我們方便的編寫一個類型轉換器。這個類提供了兩個抽象方法,以便我們將目標類型轉換爲String或者將String轉換爲目標類型。這兩個方法是convertFromStringconvertToString,關於它們的使用可以參考Struts2自帶的API說明文檔,很容易理解。下面是文檔中給出的片段:

 

三.高級類型轉換

1.處理null屬性訪問

如果action上下文中的#CREATE_NULL_OBJECTS被指定爲true,那麼當OGNL表達式遇到空指針異常時,表達式會暫時停止計算(evaluate),系統會自動嘗試創建一個新的對象來解決這個空指針問題。#CREATE_NULL_OBJECTS的值只能夠在ParametersInterceptor的執行過程中被指定。處理null屬性有如下一些規則:

      當屬性被聲明爲Collection或者List時,返回一個ArrayList對象來賦給空的reference

      當屬性聲明爲Map時,返回一個HashMap對象賦給空的reference

      當屬性聲明爲一個簡單帶有無參數構造方法的javabean時,調用無參數的構造方法生成這個javabean的實例賦給空的reference

2.對集合(Collection)Map的支持

Struts2框架支持多種方式來發現(discover)集合中元素的類型,這個發現(discover)是通過ObjectTypeDeterminer類來完成的,框架提供了這個類的默認實現。ObjectTypeDeterminer類會查看ClassName-conversion.properties文件來得知Collection或者Map中存放的是什麼對象。對Collection而言,比如List,元素是通過Element_xxx格式來指定的,xxx用來指代我們的action或者對象中Collection類型屬性的名字。對於Map而言,則需通過Key_xxx Element_xxx來分別指定KeyValue的類型,xxx仍然用來指代我們的action或者對象中Map類型屬性的名字。儘管Collection_xxx這種格式已經停止使用,但是目前仍然是支持的。下面看一個對Collection支持的例子。

首先創建一個模型beanMyBeanCollection中存放的都是這個類型的對像:

MyBean.java

這個類很簡單:一個id用於唯一標識一個對象,一個name屬性。

MyBeanAction.java

這個類中有一個Collection類型的屬性beanList,它是一個MyBean類型對象的集合。

MyBeanAction-conversion.properties

上面是一個類級別的類型轉換配置文件,Element_beanList=Mybean告訴Struts2框架我們這裏指定的不是一個類型轉換器,而是指定了集合類型的屬性beanList包含的是類型爲Mybean的對象。至於KeyProperty_beanList=id則是告訴我們beanList中的對象使用它們的id屬性來作爲identifier,相當於給這個集合加了一個索引,便於我們查找。

通過這樣的設置後我們可以在頁面上一次性提交若干個Mybean對象,實現批量保存的效果。譬如前臺的html頁面就可以這樣寫:

<input type=”text” name=”beanList[0].name”>

<input type=”text” name=”beanList[1].name”>

<input type=”text” name=”beanList[2].name”>

<input type=”text” name=”beanList[3].name”>

這樣當我們提交頁面到action中後,Struts2框架會自動爲我們在beanList集合中放置好了四個Mybean類型的對象,並且名字是我們在頁面中輸入的值,尤其是當Myben類有很多屬性的時候這個功能特別好用,可以方便的實現數據的批量保存。

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