struts2類型轉(zhuǎn)換介紹

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ī)理是不變的

  1. 新建一個(gè)package,并在該包下新建一個(gè)類,該類要繼承DefaultTypeConverter

  2. 覆蓋convertValue(Map<String, Object> context, Object value, Class toType)方法

  3. 編寫convertValue方法中的核心邏輯

  4. 在需要進(jìn)行類型轉(zhuǎn)換的Action所在的包下新建一個(gè)properties文件,該文件的命名要遵循如下規(guī)則:

ActionName-conversion.properties

  1. 在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)換器步驟

  1. 新建一個(gè)package,并在該包下新建一個(gè)類,該類要繼承DefaultTypeConverter

  2. 覆蓋convertValue(Map<String, Object> context, Object value, Class toType)方法

  3. 編寫convertValue方法中的核心邏輯

  4. 在src目錄下新建一個(gè)properties文件,該文件的命名格式如下:

xwork-conversion.propreties

  1. 在該屬性文件中鍵入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è)前端頁面代碼如下所示:

前臺(tái)頁面.png

當(dāng)我在user文本框中輸入"hello;world"并點(diǎn)擊提交的時(shí)候,要求能夠自動(dòng)注入到UserAction中的User類型的user屬性中,并且將該值輸出在output.jsp中

實(shí)現(xiàn)步驟:

  1. 首先新建一個(gè)package命名為com.shengsiyuan.action
  2. 在該包下新建一個(gè)類命名為UserAction并繼承ActionSupport類
  3. UserAction類中包含屬性-user:User 并生成setter/getter方法
  4. 在該類下覆蓋+ execute():String 方法,并返回SUCCESS
  5. 新建一個(gè)package命名為com.shengsiyuan.model,并在該包下新建一個(gè)類命名為User,該類包含兩個(gè)屬性-username:String -password:String 并生成setter/getter方法
  6. 新建一個(gè)package命名為com.shengsiyuan.converter,并在該包下新建一個(gè)類UserActionUserConverter,該類繼承DefaultTypeConverter,并覆蓋及實(shí)現(xiàn)方法convertValue,具體代碼如下:
自定義轉(zhuǎn)換器.png
  1. 在 com.shengsiyuan.action包下新建屬性文件UserAction-conversion.properties,該屬性文件中的內(nèi)容為user=com.shengsiyuan.converter.UserActionUserConverter
  2. 新建output.jsp文件,該jsp文件使用struts標(biāo)簽庫,并將UserAction中的user進(jìn)行輸出,具體實(shí)現(xiàn)如下圖所示:
output.jsp.png

測(cè)試:

首先訪問login_1.jsp:

login_1.jsp.png

點(diǎn)擊提交后:

result.png

測(cè)試結(jié)果:成功

小結(jié):自定義轉(zhuǎn)換器的實(shí)現(xiàn)主要由Action、Model、自定義轉(zhuǎn)換器、屬性文件構(gòu)成

7.2. 練習(xí)二

現(xiàn)有如下頁面:

前臺(tái)頁面.png

要求:該表單提交后,四個(gè)文本框的值能夠自動(dòng)注入到UserAction對(duì)象的屬性- userList:List<User>中,然后跳轉(zhuǎn)到output.jsp中并輸出這四個(gè)文本框的值

實(shí)現(xiàn)步驟:

實(shí)現(xiàn)步驟與練習(xí)一相似,提幾個(gè)注意點(diǎn):

  1. UserAction中的屬性應(yīng)該定義為List<User>類型,如下圖所示:
UserAction.png
  1. 自定義轉(zhuǎn)換器中要進(jìn)行代碼調(diào)整,這里使用StrutsTypeConverter,為了演示不同的形式罷了,如下圖所示:
自定義轉(zhuǎn)換器代碼.png

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視頻>>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,534評(píng)論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,637評(píng)論 18 399
  • 標(biāo)簽 如果要配置的標(biāo)簽,那么必須要先配置標(biāo)簽,代表的包的概念。 包含的屬性 name包的名稱,要求是唯一的,管理a...
    偷偷得路過閱讀 1,514評(píng)論 0 0
  • 阿太是《皮囊》中的第一個(gè)故事。 阿太是作者外婆的媽媽,是作者心中的“定海神針”,有她在,作者就覺得心中安穩(wěn)。 作者...
    想跳舞的魚閱讀 4,310評(píng)論 0 2
  • 上面兩篇介紹了庫的接口及封裝,還有個(gè)問題就是數(shù)據(jù)的處理。 問題一:怎么處理通過回調(diào)【-(void) onSocke...
    小兒小二閱讀 1,048評(píng)論 0 3

友情鏈接更多精彩內(nèi)容