類型轉換
1、默認轉換
日期的處理
??? ??? 使用<s:date format=”yyyy-MM-dd HH:mm:ss” name=”date”>標簽,具體見文檔
?
Struts2有對應的攔截器已經做了一些默認的轉換
?? 參數傳遞轉換:
簡單類型轉換 test?name=a&age=2 日期類型 test?date=1988-08-08 List類型 List<String> interests test?interests=math&interests=English Set類型 Set<String> interests test?interests=math&interests=English Map類型 Map<String, String> users test?users[‘a’]=usera&users[‘b’]=userb
?
2、自定義類型轉換器
Locale文本輸入框對應是Action中的類型為java.util.Locale的屬性loc,
所以需要創建一個自定義轉變器實現兩者間的轉換。
?
所有的Struts 2中的轉換器都必須實現ognl.TypeConverter接口 。
?
為了簡單起見,OGNL包也為你提供了ognl.DefaultTypeConverter類去幫助您實現轉換器。
在例子中,LocaleConverter繼承了ognl.DefaultTypeConverter,
重載了其方法原型為“ public Object convertValue(Map context, Object value, Class toType) ”的方法。
?
下面簡單地介紹一下函數的參數:
context——用于獲取當前的ActionContext
value——需要轉換的值
toType——需要轉換成的目標類型
當然也可以更簡單的實現
StrutsTypeConverter
,只需要重寫
convertFromString
、
convertToString
方法。
實現轉換器,我們需要通過配置告訴Struts 2。我們可以通過以下兩種方法做到這點:
1.
配置全局的類型轉換器,也即是上例的做法——在源代碼文件夾下,新建一個名為“xwork-conversion.properties”的
?? 配置文件,并在文件中加入“待轉換的類型的全名(包括包路徑和類名)=轉換器類的全名”對;
?
2. 應用于某個特定類的類型轉換器,做法為在該類的包中添加一個格式為“類名-conversion.properties”的配置文件 ,并
?? 在文件中加入“待轉換的屬性的名字=轉換器類的全名”對。上面的例子也可以這樣配置——在源代碼文件夾的tutorial包
?? 下新建名為“HelloWorld-conversion.properties”文件,并在其中加入“java.util.Locale =
??? tutorial.LocaleConverter”。
3、已有的轉換器
對于一此經常用到的轉換器,如日期、整數或浮點數等類型,Struts 2.0已經為您實現了。下面列出已經實現的轉換器。
預定義類型,例如int、boolean、double等;
?
日期類型
,使用當前區域(Locale)的短格式轉換
,即DateFormat.getInstance(DateFormat.SHORT);
集合(Collection)類型, 將request.getParameterValues(String arg)返回的字符串數據與java.util.Collection轉換;
集合(Set)類型
, 與List的轉換相似,去掉相同的值;
數組(Array)類型
, 將字符串數組的每一個元素轉換成特定的類型,并組成一個數組。
對于已有的轉換器,大家不必再去重新發明輪子。Struts在遇到這些類型時,會自動去調用相應的轉換器。
4、轉換錯誤處理
不知道大家在運行上面的例子時,有沒有填錯日期或數字情況,又或者您有沒有思考過這種情況?
如果還沒有嘗試的朋友可以試一下,在第一行的Price和 Date of production中輸入英文字母,然后按“Submit”提交。
你會看到頁面為空白,再看一下服務器的控制臺輸出,
有如下語句:
警告: No result defined for action tutorial.ProductConfirm and result input,
它提示我們沒有為Action定義輸入結果,
所以, 我們應該在源代碼文件夾下的struts.xml中的ProductConfirm Action 中加入以下代碼:
<result name="input">/AddProducts.jsp</result>
重新加載應用程序,刷新瀏覽器重新提交請求,這時頁面返回AddProducts.jsp,格式錯誤的輸入框的值被保留,
如下圖所示:
?
?
?
圖 沒有提示的錯返回頁面
?
當然,我們還可以在頁面上加上錯誤提示信息,通過在AddProducts.jsp的“<body>”后,加入下面代碼可以實現:
<div style="color:red"> <s:fielderror /> </div>
刷新瀏覽器,重新提交請求,出現如圖所示頁面:
?圖 帶提示的錯返回頁面
Struts 2.0里的一個名為conversionError的攔截器(interceptor)工作,它被注冊到默認攔截器棧(default interceptor stack)中。
?
Struts 2.0在轉換出錯后,會將錯誤放到ActionContext中,在conversionError的作用是將這些錯誤封裝為對應的項錯誤(field error),因此我們可以通過<s:fielderror />來將其在頁面上顯示出來。另外,大家看第二和第三行的Price都被賦為0.0的值,而第一行則保留其錯誤值。這同樣是conversionError的功勞——沒有出錯的行調用的products[index].price(默認值為0.0),而出錯的行則會被賦為頁面所提交的錯誤值,這樣可以提供更好的用戶體驗。
如:
<action name="test" class="com.bjsxt.action.TestAction"> <result>/test.jsp</result> <result name="input">/test.jsp</result> </action>?
表示當轉換失敗轉到test.jsp頁面
總結:
?a)?? ?默認轉換
?? i.?? ?日期處理
?b)?? ?寫自己的轉換器:
public class MyPointConverter extends DefaultTypeConverter{ @Override public Object convertValue(Object value, Class toType) { if(toType == Point.class) { Point p = new Point(); String[] strs = (String[])value; String[] xy = strs[0].split(","); p.x = Integer.parseInt(xy[0]); p.y = Integer.parseInt(xy[1]); return p; } if(toType == String.class) { return value.toString(); } return super.convertValue(value, toType); } } public class MyPointConverter extends StrutsTypeConverter{ @Override public Object convertFromString(Map context, String[] values, Class toClass) { Point p = new Point(); String[] strs = (String[])values; String[] xy = strs[0].split(","); p.x = Integer.parseInt(xy[0]); p.y = Integer.parseInt(xy[1]); return p; } @Override public String convertToString(Map context, Object o) { // TODO Auto-generated method stub return o.toString(); } }
?c)?? ?三種注冊方式:
?? i.?? ?局部:XXXAction-conversion.properties
??????? 1.?? ?p(屬性名稱) =? converter
?? ii.?? ?全局:xwork-conversion.properties
??????? 1.?? ?com.xxx.XXX(類名)= converter
?? iii.?? ?Annotation
?d)?? ?如果遇到非常麻煩的映射轉換
?? i.?? ?request.setAttribute();
?? ii.?? ?session
剩下部分
內容
:
1.??? Lambda表達式
2.??? 驗證框架
3.??? UI標簽
4.??? 類型轉換中的異常處理
5.??? 上傳與下載文件
6.??? Struts2注解
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
