Struts2的類型轉換

jopen 11年前發布 | 21K 次閱讀 Struts2 Web框架

Struts2的類型轉換是基于XWork的,實際上是基于OGNL的,它是一種強大的表達式語言
Struts2主要是通過實現OGNL類中的TypeConverter接口的方式,來完成類型轉換
而該接口比較復雜,它只是描述了最通用的一種情況,所以通常都不會直接實現該接口
OGNL本身又提供了一個實現了TypeConverter接口的類,即DefaultTypeConverter類
我們的類直接繼承DefaultTypeConverter類,然后重寫它的convertValue()方法即可


DefaultTypeConverter類提供了兩個convertValue()方法
convertValue(Map context, Object target, Member member,String propertyName, Object value, Class toType)
convertValue(Map context, Object value, Class toType)
其中第二個方法是對第一個方法的一種簡化,我們只需要重寫第二個比較簡便的方法就可以了
而Struts2本身也是通過對convertValue()方法的重寫,來實現數據的類型轉換的
參數Map類型的context代表應用的上下文。這個參數暫時還用不上
參數Object類型的value代表需要進行類型轉換的值
參數Class類型的toType代表所要轉換成的目標類型
通常有兩種情況的類型轉換。第一種情況是從客戶端的字符串到自定義類型的轉換
第二種情況是在頁面中輸出內容的時候,從自定義類型到String的一個轉換
toType決定了到底是從String到自定義類型的轉換,還是從自定義類型到String的轉換
所以這里的toType分為兩種情況,也就需要在convertValue()方法中對toType進行判斷


Struts2也內置了一個簡化的類型轉換,即org.apache.struts2.util.StrutsTypeConverter類
它是一個抽象類,它繼承了ognl.DefaultTypeConverter類
它有一個converFromString(Map context, String[] values, Class toClass)方法
用來將字符串類型轉換為一個對象類型,所以它的返回值為Object類型
還有一個converToString(Map context,Object o)方法,用來將對象類型轉換為String類型
而實際項目開發中的自定義數據類型轉換,也是通過繼承StrutsTypeConverter類實現的


定義PointAction-conversion.properties屬性文件
該文件用于指定對PointAction的屬性進行類型轉換的屬性文件,它應與Action位于同包中
在定義該屬性文件時, -conversion.properties 是固定的,然后在其前面指定具體的Action
然后在PointAction-conversion.properties指定對PointAction中的哪個屬性進行類型轉換
比如在該屬性文件中增加該行代碼point=com.jadyer.converter.PointConverter
這樣Struts2就知道,我們是要使用PointConverter類對PointAction中的point屬性進行轉換
若需要對PointAction的多個屬性進行轉換,那么就在該屬性文件中添加多行類似代碼即可


Struts2的全局類型轉換的屬性文件
Struts2的全局類型轉換的屬性文件的文件名是固定的,即xwork-conversion.properties
該文件在整個應用中只能出現一個,并且它必須與struts.xml位于相同的目錄下
它配置的內容例如com.jadyer.bean.Point = com.jadyer.converter.PointConverter
即指明整個應用的所有的Point類型的變量都使用PointConverter轉換器進行轉換


類型轉換的具體流程
客戶端提交表單之后,首先會到struts.xml中查找是否存在名為pointConverter<action/>
找到了之后,就知道是由PointAction類的一個對象來處理我們的請求< br /> 此時流程就轉到了PointAction中了,生成了PointAction的一個實例
當這個實例生成之后,它首先會根據提交過來的表單中的name屬性來得到個輸入域的值
然后把這些值一一的調用setter()方法賦給PointAction中的每一個屬性
若它檢查到沒有定義自定義類型轉換的屬性文件時,便按照自己的默認行為進行類型轉換
對于int、String、Date等,Struts2都會自動完成類型轉換,但對象類型,則須手工轉換
即如果它發現存在一個PointAction-conversion.properties文件的話
它就會到該文件中查找,是對PointAction中的哪個屬性進行轉換,以及對應的轉換類
然后流程便切換到轉換類中,按照轉換類中的代碼進行自定義的轉換
最后將返回的值賦給PointAction中的該屬性
當為PointAction的所有屬性賦好值后,便執行execute()方法,于是轉到了output.jsp
接著就會調用<s:property/>中的value值所對應的getter()方法獲取參數值
但是當進行point屬性輸出的時候,它又會去檢查有沒有對應point的自定義類型轉換
結果發現有,則流程轉到PointConverter中,最后將其返回值輸出到<s:property/>的位置

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!