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

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