一篇文章搞定Struts2的類型轉(zhuǎn)換
前言
我們知道通過HTTP提交到后臺(tái)的數(shù)據(jù),都是字符串的形式,而我們需要的數(shù)據(jù)類型當(dāng)然不只字符串類型一種。所以,我們需要類型轉(zhuǎn)換!下面來(lái)看看詳細(xì)的介紹吧。
一、類型轉(zhuǎn)換的意義
所有的MVC框架,解決的都是表現(xiàn)層的解決方案,都需要收集用戶請(qǐng)求參數(shù),并把參數(shù)提供給控制器。但是,在Web應(yīng)用中所有的請(qǐng)求參數(shù)都是字符串類型的,Java是強(qiáng)類型的語(yǔ)言,如何將字符串轉(zhuǎn)換為Java類型,這是框架要解決的一個(gè)問題。
例如,一個(gè)注冊(cè)頁(yè)需要輸入年齡、日期等。這時(shí)候就需要將日期、年齡字符串轉(zhuǎn)換為相應(yīng)類型。
二、Struts2的類型轉(zhuǎn)換器
Struts2提供了內(nèi)置的類型轉(zhuǎn)換器,對(duì)于大部分類型,開發(fā)者無(wú)需自定義類型轉(zhuǎn)換器,使用內(nèi)置的類型轉(zhuǎn)換器就可以完成我們需要的類型轉(zhuǎn)換。
內(nèi)置類型轉(zhuǎn)換器有:
1.boolean和Boolean
2.char和Character
3.int和Integer
4.long和Long
5.float和Float
6.double和Double
7.date
比如我們?cè)陧?yè)面輸入20,傳輸?shù)胶笈_(tái)肯定是字符串類型。但是Struts框架的內(nèi)置類型轉(zhuǎn)換可以把20轉(zhuǎn)換為int型。但是如果我們轉(zhuǎn)換abc這樣的為int是行不通的。
三、自定義類型轉(zhuǎn)換器的實(shí)現(xiàn)
1、需求分析
比如我們需要在頁(yè)面上輸入(2,3)這樣一個(gè)坐標(biāo)點(diǎn),將該點(diǎn)轉(zhuǎn)換為一個(gè)點(diǎn)對(duì)象類型。
2、實(shí)現(xiàn)
當(dāng)內(nèi)置類型轉(zhuǎn)換無(wú)法滿足我們的需求的時(shí)候,需要用到自定義類型轉(zhuǎn)換。Struts2的類型轉(zhuǎn)換時(shí)基于ONGL的,在ONGL中有一個(gè)接口TypeConverter,該接口中有一個(gè)方法converterValue,該方法很復(fù)雜。其中還有一個(gè)默認(rèn)的實(shí)現(xiàn)類DefaultTypeConverter,通過該類來(lái)實(shí)現(xiàn)類型轉(zhuǎn)換。
package com.study.converter; import java.util.Map; import com.study.bean.Point; import ognl.DefaultTypeConverter; public class PointConverter extends DefaultTypeConverter{ public Object convertValue(Map context, Object value, Class toType) { if(toType==Point.class){ String []strs = (String[])value; String []xy = strs[0].split(","); int x = Integer.valueOf(xy[0]); int y = Integer.valueOf(xy[1]); Point p = new Point(); p.setX(x); p.setY(y); return p; }else if(toType==String.class){ Point p = (Point) value; return "["+p.getX()+","+p.getY()+"]"; }else{ return null; } } }
這就是轉(zhuǎn)換器的一個(gè)簡(jiǎn)單實(shí)現(xiàn),把頁(yè)面?zhèn)鬏數(shù)闹颠M(jìn)行解析,最后轉(zhuǎn)換為Point類型。然后要讓類型轉(zhuǎn)換器起作用,需要進(jìn)行配置
struts2提供了兩種配置方法:
a.局部:首先創(chuàng)建文件命名如Actionname-conversion.properties,里面的內(nèi)容為 屬性=類型轉(zhuǎn)換器(ponit=com.study.converter
)需要寫在包下面
b.全局:首先創(chuàng)建文件命名如xwork-conversion.properties,內(nèi)容為com.study.bean.Ponit=com.study.converter
。文件需要寫在src下面
3、Struts的實(shí)現(xiàn)
struts2中有一個(gè)StrutsTypeConverter類,它是繼承DefaultTypeConverter。使用它來(lái)自定義轉(zhuǎn)換器更加方便,示例代碼如下:
package com.study.converter; import java.util.Map; import org.apache.struts2.util.StrutsTypeConverter; import com.study.bean.Point; public class PointConverter extends StrutsTypeConverter{ public Object convertFromString(Map map, String[] obj, Class toType) { String []strs = obj; String []xy = strs[0].split(","); int x = Integer.valueOf(xy[0]); int y = Integer.valueOf(xy[1]); Point p = new Point(); p.setX(x); p.setY(y); return p; } public String convertToString(Map map, Object obj) { Point p = (Point) obj; return "["+p.getX()+","+p.getY()+"]"; } }
4、類型轉(zhuǎn)換器的錯(cuò)誤處理
Struts2提供了一個(gè)名為conversionError的攔截器,如果類型轉(zhuǎn)換出現(xiàn)錯(cuò)誤,攔截器負(fù)責(zé)將錯(cuò)誤封裝成表單錯(cuò)誤(filederror),并將錯(cuò)誤信息放入ActionContext中。
如何那么改變默認(rèn)類型轉(zhuǎn)換錯(cuò)誤的錯(cuò)誤提示信息?
方法一:
首先創(chuàng)建一個(gè)資源文件Mess.properties,放在src下面
然后覆蓋xwork-core-2.3.31\com\opensymphony\xwork2\xwork-messages.properties里面的屬性xwork.default.invalid.fieldvalue。即在Mess.properties中寫入如下參數(shù)
xwork.default.invalid.fieldvalue="{0}"參數(shù)轉(zhuǎn)換失敗.
然后指定我們的資源文件,在struts.xml中(不需要加文件后綴)
<constant name="struts.custom.i18n.resources" value="Mess"></constant>
方法二:
為某個(gè)action的字段提供錯(cuò)誤信息提示
定義Actionname.properties文件,添加配置——Invalid.fieldvalue.屬性名=提示信息
總計(jì)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問大家可以留言交流。
相關(guān)文章
詳解WebSocket+spring示例demo(已使用sockJs庫(kù))
本篇文章主要介紹了WebSocket spring示例demo(已使用sockJs庫(kù)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2017-01-01JavaWeb使用Session和Cookie實(shí)現(xiàn)登錄認(rèn)證
本篇文章主要介紹了JavaWeb使用Session和Cookie實(shí)現(xiàn)登錄認(rèn)證,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03Java 判斷線程池所有任務(wù)是否執(zhí)行完畢的操作
這篇文章主要介紹了Java 判斷線程池所有任務(wù)是否執(zhí)行完畢的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-08-08java判斷某個(gè)點(diǎn)是否在所畫多邊形/圓形內(nèi)
這篇文章主要為大家詳細(xì)介紹了java判斷某個(gè)點(diǎn)是否在所畫多邊形或圓形內(nèi)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05Spring Boot基于數(shù)據(jù)庫(kù)如何實(shí)現(xiàn)簡(jiǎn)單的分布式鎖
這篇文章主要給大家介紹了關(guān)于Spring Boot基于數(shù)據(jù)庫(kù)如何實(shí)現(xiàn)簡(jiǎn)單的分布式鎖的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07通過實(shí)例學(xué)習(xí)Java集合框架HashSet
這篇文章主要介紹了通過實(shí)例學(xué)習(xí)Java集合框架HashSet,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12很多人竟然不知道Java線程池的創(chuàng)建方式有7種
本文主要介紹了很多人竟然不知道Java線程池的創(chuàng)建方式有7種,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07