1. ActionSupport介紹
我們自定義一個(gè)Action的時(shí)候来颤,通常需要繼承ActionSupport,因?yàn)锳ctionSupport實(shí)現(xiàn)了一系列的接口输瓜,也就是說(shuō)通過(guò)繼承它嗅剖,我們可以很方便的實(shí)現(xiàn)一些功能,例如:國(guó)際化蕾域、數(shù)據(jù)校驗(yàn)
2. DefaultTypeConverter介紹
我們自定義開(kāi)發(fā)的類(lèi)型轉(zhuǎn)換器需要直接或間接繼承它,才能夠被struts2框架調(diào)用
3. StrutsTypeConverter介紹
struts2自帶的類(lèi)型轉(zhuǎn)換器的父類(lèi)到旦,繼承了DefaultTypeConverter旨巷,也就是說(shuō)對(duì)DefaultTypeConverter進(jìn)行了優(yōu)化,通過(guò)繼承它更方便開(kāi)發(fā)者開(kāi)發(fā)自己的類(lèi)型轉(zhuǎn)換器
4. 自定義局部轉(zhuǎn)換器實(shí)現(xiàn)步驟
首先要說(shuō)明StrutsTypeConverter底層使用的就是DefaultTypeConverter添忘,所以我們自定義的類(lèi)型轉(zhuǎn)換器不管是繼承誰(shuí)采呐,其實(shí)現(xiàn)機(jī)理是不變的
新建一個(gè)package,并在該包下新建一個(gè)類(lèi)搁骑,該類(lèi)要繼承DefaultTypeConverter
覆蓋convertValue(Map<String, Object> context, Object value, Class toType)方法
編寫(xiě)convertValue方法中的核心邏輯
在需要進(jìn)行類(lèi)型轉(zhuǎn)換的Action所在的包下新建一個(gè)properties文件斧吐,該文件的命名要遵循如下規(guī)則:
ActionName-conversion.properties
- 在ActionName-conversion.properties文件中輸入key/value,該key是Action中需要進(jìn)行類(lèi)型轉(zhuǎn)換的屬性名(準(zhǔn)確的說(shuō)是該屬性所對(duì)應(yīng)的方法名的后綴仲器,即setXXX中的xxx)而value為之前新建的類(lèi)型轉(zhuǎn)換器的全限定名
這樣當(dāng)struts2處理http請(qǐng)求的時(shí)候煤率,當(dāng)發(fā)現(xiàn)有符合條件的自定義類(lèi)型轉(zhuǎn)換器的時(shí)候,就會(huì)使用該轉(zhuǎn)換器進(jìn)行類(lèi)型轉(zhuǎn)換娄周,并將轉(zhuǎn)換后的結(jié)果涕侈,注入到Action對(duì)應(yīng)的屬性中沪停,同理當(dāng)需要將該Action的屬性輸出到頁(yè)面上的時(shí)候煤辨,也會(huì)經(jīng)過(guò)我們自定義的類(lèi)型轉(zhuǎn)換器,從而將java對(duì)象以字符串的形式輸出到頁(yè)面上
5. 自定義全局轉(zhuǎn)換器步驟
新建一個(gè)package木张,并在該包下新建一個(gè)類(lèi)众辨,該類(lèi)要繼承DefaultTypeConverter
覆蓋convertValue(Map<String, Object> context, Object value, Class toType)方法
編寫(xiě)convertValue方法中的核心邏輯
在src目錄下新建一個(gè)properties文件,該文件的命名格式如下:
xwork-conversion.propreties
- 在該屬性文件中鍵入key/value舷礼,kay的值為需要進(jìn)行類(lèi)型轉(zhuǎn)換的屬性的類(lèi)型鹃彻,value的值還是自定義類(lèi)型轉(zhuǎn)換器的全限定名
6. 類(lèi)型轉(zhuǎn)換器生效優(yōu)先級(jí)
局部類(lèi)型轉(zhuǎn)換器優(yōu)先級(jí)高于全局類(lèi)型轉(zhuǎn)換器,換言之妻献,當(dāng)都符合條件的情況下蛛株,局部類(lèi)型轉(zhuǎn)換器會(huì)生效而全局類(lèi)型轉(zhuǎn)換器不會(huì)生效
7. 實(shí)戰(zhàn)練習(xí)
7.1. 練習(xí)一
現(xiàn)有一個(gè)前端頁(yè)面代碼如下所示:
當(dāng)我在user文本框中輸入"hello;world"并點(diǎn)擊提交的時(shí)候,要求能夠自動(dòng)注入到UserAction中的User類(lèi)型的user屬性中育拨,并且將該值輸出在output.jsp中
實(shí)現(xiàn)步驟:
- 首先新建一個(gè)package命名為com.shengsiyuan.action
- 在該包下新建一個(gè)類(lèi)命名為UserAction并繼承ActionSupport類(lèi)
- UserAction類(lèi)中包含屬性-user:User 并生成setter/getter方法
- 在該類(lèi)下覆蓋+ execute():String 方法谨履,并返回SUCCESS
- 新建一個(gè)package命名為com.shengsiyuan.model,并在該包下新建一個(gè)類(lèi)命名為User熬丧,該類(lèi)包含兩個(gè)屬性-username:String -password:String 并生成setter/getter方法
- 新建一個(gè)package命名為com.shengsiyuan.converter笋粟,并在該包下新建一個(gè)類(lèi)UserActionUserConverter,該類(lèi)繼承DefaultTypeConverter,并覆蓋及實(shí)現(xiàn)方法convertValue害捕,具體代碼如下:
- 在 com.shengsiyuan.action包下新建屬性文件UserAction-conversion.properties绿淋,該屬性文件中的內(nèi)容為user=com.shengsiyuan.converter.UserActionUserConverter
- 新建output.jsp文件,該jsp文件使用struts標(biāo)簽庫(kù)尝盼,并將UserAction中的user進(jìn)行輸出吞滞,具體實(shí)現(xiàn)如下圖所示:
測(cè)試:
首先訪(fǎng)問(wèn)login_1.jsp:
點(diǎn)擊提交后:
測(cè)試結(jié)果:成功
小結(jié):自定義轉(zhuǎn)換器的實(shí)現(xiàn)主要由Action、Model东涡、自定義轉(zhuǎn)換器冯吓、屬性文件構(gòu)成
7.2. 練習(xí)二
現(xiàn)有如下頁(yè)面:
要求:該表單提交后,四個(gè)文本框的值能夠自動(dòng)注入到UserAction對(duì)象的屬性- userList:List<User>中疮跑,然后跳轉(zhuǎn)到output.jsp中并輸出這四個(gè)文本框的值
實(shí)現(xiàn)步驟:
實(shí)現(xiàn)步驟與練習(xí)一相似组贺,提幾個(gè)注意點(diǎn):
- UserAction中的屬性應(yīng)該定義為L(zhǎng)ist<User>類(lèi)型,如下圖所示:
- 自定義轉(zhuǎn)換器中要進(jìn)行代碼調(diào)整祖娘,這里使用StrutsTypeConverter失尖,為了演示不同的形式罷了,如下圖所示:
8. 總結(jié)
自定義類(lèi)型轉(zhuǎn)換器還是比較麻煩的一件事情渐苏,在使用spring框架的時(shí)候就沒(méi)有這種問(wèn)題掀潮,看來(lái)spring框架對(duì)此進(jìn)行了封裝或改良,但我想類(lèi)型轉(zhuǎn)換這一塊底層的實(shí)現(xiàn)應(yīng)該差不多吧琼富,系統(tǒng)學(xué)習(xí)spring的時(shí)候再看吧
9. 內(nèi)容引用來(lái)源
<< 張龍JavaEE視頻>>