按照Struts2的工作流程,當請求發送過來的時候,一般情況下,你的Action會繼承ActionSupport以及在struts.xml配置中會有一個這樣的預設包extends="struts-default";這個包預設的會進行一些必要的工作,比如前面所說的類型轉換,資料校驗等等;Struts2的類型轉換我在網上找到一篇比較好的文章,不過這篇文章是類型轉換的自定義使用;
我先來說說自己對類型轉換的工作原理簡單說說:當請求發送,你會注意到:表單中的TEXT類型都是以String類型傳值的,但是有時你會發現,你的Action中的屬性值會是int,或者double或者其他的常用類型,神奇的便是Struts2不但自動的找到相應的參數,并且會将傳過來的參數值進行類型轉換,轉化為你Action中需要的資料類型;這便是預設包中的配置起的作用,有了這些包中的配置,Struts2會在請求發送給Action之前進行類型轉化,還有資料校驗;你可以嘗試着不添加這個預設包,進行傳值操作,便會出現類型轉換的錯誤。當然了,這些類型轉化和資料校驗之是以能夠被執行,依賴的依然是interceptor,interceptor貫穿Action的全過程,攔截器比較靈活,可以再Action之前之後都能進行一些額外的操作,下面不在粘貼預設包中的配置資訊,你可以在Struts2核心包中的strus-default.xml中檢視;
通常,我們不需要自定義類型轉化,但是有些表單中特殊的參數不得不使用類型轉換,常見的便是表單中的參數是一個String但是,Action中時一個實體類,這時候你不得不進行自定義的類型轉化,還有就是表單中一些list,map等特殊資料類型,這些資料類型Struts2并沒有幫我們做好類型的轉化,需要我們自己進行;下面是Struts2(Xwork)所支援的類型轉化,其他的類型需要自定義轉化;
總結:
(1). web.xml中配置了Struts2的過濾器filter,過濾請求;
(2). Struts2的org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter;進 行相應的操作;
(3). Struts2,讀取Struts.xml檔案開始調用Action;
(4). 調用Action前,被intercepter攔下;
(5). 攔下之後,進行類型轉化或者資料校驗等;
(6). 上面的操作進行完之後,Struts2會将相應的結果開始發送給前台顯示頁面;
(7). 不幸的這個結果依然被攔截器intercepter攔下,進行一些“鬼知道”的操作;
(8). 終于,可以将結果頁面按照struts.xml中的result中配置轉發過去;
這些僅僅是按照Struts2預設的配置;如果自定義攔截,或者不繼承預設包中配置,這些工作流程看上去會混亂不堪,你僅僅記住,這些操作,都是在請求被攔截器攔下之後,在Action處理前後,添加的其他操作;附一些源碼:類型轉換的執行個體;
自定義的類型轉化的原理是,你在項目中配置的屬性檔案,并且在struts.xml中指明了屬性檔案,
<constant name="struts.custom.i18n.resources" value="global"></constant>
Struts2在讀取struts.xml時,檢測到了屬性檔案,便去尋找屬性檔案(當然,有時候項目中有許多屬性檔案),将所有屬性檔案讀取,讀取到類型轉化的屬性檔案的時候,檢測符合類型轉化的命名規則,便又去尋找相對應的自定義類型轉化器,請求經過這個轉化器處理之後,在将處理結果交給Action,顯然Action接到被處理的資料,渾然不覺,我感覺Action此時就是一個SB;
不行了, 我自拔不能了,你有沒有,想過在struts.xml配置了
<constant name="struts.custom.i18n.resources" value="global"></constant>Struts2為何,便會去尋找屬性檔案,個人認為是,xml的解析器的功勞!
轉載于:https://blog.51cto.com/seasky09/1223387