1. ActionSupport介紹
我們自定義一個(gè)Action的時(shí)候,通常需要繼承ActionSupport,因?yàn)锳ctionSupport實(shí)現(xiàn)了一系列的接口,也就是說通過繼承它,我們可以很方便的實(shí)現(xiàn)一些功能,例如:國際化、數(shù)據(jù)校驗(yàn)
2. DefaultTypeConverter介紹
我們自定義開發(fā)的類型轉(zhuǎn)換器需要直接或間接繼承它,才能夠被struts2框架調(diào)用
3. StrutsTypeConverter介紹
struts2自帶的類型轉(zhuǎn)換器的父類,繼承了DefaultTypeConverter,也就是說對(duì)DefaultTypeConverter進(jìn)行了優(yōu)化,通過繼承它更方便開發(fā)者開發(fā)自己的類型轉(zhuǎn)換器
4. 自定義局部轉(zhuǎn)換器實(shí)現(xiàn)步驟
首先要說明StrutsTypeConverter底層使用的就是DefaultTypeConverter,所以我們自定義的類型轉(zhuǎn)換器不管是繼承誰,其實(shí)現(xiàn)機(jī)理是不變的
新建一個(gè)package,并在該包下新建一個(gè)類,該類要繼承DefaultTypeConverter
覆蓋convertValue(Map<String, Object> context, Object value, Class toType)方法
編寫convertValue方法中的核心邏輯
在需要進(jìn)行類型轉(zhuǎn)換的Action所在的包下新建一個(gè)properties文件,該文件的命名要遵循如下規(guī)則:
ActionName-conversion.properties
- 在ActionName-conversion.properties文件中輸入key/value,該key是Action中需要進(jìn)行類型轉(zhuǎn)換的屬性名(準(zhǔn)確的說是該屬性所對(duì)應(yīng)的方法名的后綴,即setXXX中的xxx)而value為之前新建的類型轉(zhuǎn)換器的全限定名
這樣當(dāng)struts2處理http請(qǐng)求的時(shí)候,當(dāng)發(fā)現(xiàn)有符合條件的自定義類型轉(zhuǎn)換器的時(shí)候,就會(huì)使用該轉(zhuǎn)換器進(jìn)行類型轉(zhuǎn)換,并將轉(zhuǎn)換后的結(jié)果,注入到Action對(duì)應(yīng)的屬性中,同理當(dāng)需要將該Action的屬性輸出到頁面上的時(shí)候,也會(huì)經(jīng)過我們自定義的類型轉(zhuǎn)換器,從而將java對(duì)象以字符串的形式輸出到頁面上
5. 自定義全局轉(zhuǎn)換器步驟
新建一個(gè)package,并在該包下新建一個(gè)類,該類要繼承DefaultTypeConverter
覆蓋convertValue(Map<String, Object> context, Object value, Class toType)方法
編寫convertValue方法中的核心邏輯
在src目錄下新建一個(gè)properties文件,該文件的命名格式如下:
xwork-conversion.propreties
- 在該屬性文件中鍵入key/value,kay的值為需要進(jìn)行類型轉(zhuǎn)換的屬性的類型,value的值還是自定義類型轉(zhuǎn)換器的全限定名
6. 類型轉(zhuǎn)換器生效優(yōu)先級(jí)
局部類型轉(zhuǎn)換器優(yōu)先級(jí)高于全局類型轉(zhuǎn)換器,換言之,當(dāng)都符合條件的情況下,局部類型轉(zhuǎn)換器會(huì)生效而全局類型轉(zhuǎn)換器不會(huì)生效
7. 實(shí)戰(zhàn)練習(xí)
7.1. 練習(xí)一
現(xiàn)有一個(gè)前端頁面代碼如下所示:

當(dāng)我在user文本框中輸入"hello;world"并點(diǎn)擊提交的時(shí)候,要求能夠自動(dòng)注入到UserAction中的User類型的user屬性中,并且將該值輸出在output.jsp中
實(shí)現(xiàn)步驟:
- 首先新建一個(gè)package命名為com.shengsiyuan.action
- 在該包下新建一個(gè)類命名為UserAction并繼承ActionSupport類
- UserAction類中包含屬性-user:User 并生成setter/getter方法
- 在該類下覆蓋+ execute():String 方法,并返回SUCCESS
- 新建一個(gè)package命名為com.shengsiyuan.model,并在該包下新建一個(gè)類命名為User,該類包含兩個(gè)屬性-username:String -password:String 并生成setter/getter方法
- 新建一個(gè)package命名為com.shengsiyuan.converter,并在該包下新建一個(gè)類UserActionUserConverter,該類繼承DefaultTypeConverter,并覆蓋及實(shí)現(xiàn)方法convertValue,具體代碼如下:

- 在 com.shengsiyuan.action包下新建屬性文件UserAction-conversion.properties,該屬性文件中的內(nèi)容為user=com.shengsiyuan.converter.UserActionUserConverter
- 新建output.jsp文件,該jsp文件使用struts標(biāo)簽庫,并將UserAction中的user進(jìn)行輸出,具體實(shí)現(xiàn)如下圖所示:

測(cè)試:
首先訪問login_1.jsp:

點(diǎn)擊提交后:

測(cè)試結(jié)果:成功
小結(jié):自定義轉(zhuǎn)換器的實(shí)現(xiàn)主要由Action、Model、自定義轉(zhuǎn)換器、屬性文件構(gòu)成
7.2. 練習(xí)二
現(xiàn)有如下頁面:

要求:該表單提交后,四個(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)該定義為List<User>類型,如下圖所示:

- 自定義轉(zhuǎn)換器中要進(jìn)行代碼調(diào)整,這里使用StrutsTypeConverter,為了演示不同的形式罷了,如下圖所示:

8. 總結(jié)
自定義類型轉(zhuǎn)換器還是比較麻煩的一件事情,在使用spring框架的時(shí)候就沒有這種問題,看來spring框架對(duì)此進(jìn)行了封裝或改良,但我想類型轉(zhuǎn)換這一塊底層的實(shí)現(xiàn)應(yīng)該差不多吧,系統(tǒng)學(xué)習(xí)spring的時(shí)候再看吧
9. 內(nèi)容引用來源
<< 張龍JavaEE視頻>>