前篇文章對struts2的一個入門,重點是對struts2的架構圖有一個大概的瞭解便可,以後的幾篇文章,就是細化struts2,將struts2中的各類功能進行梳理,其實學完以後,對struts2的使用不外乎這幾點,參數自動封裝,攔截器的使用,數據校驗,ognl表達(值棧和actionContext的講解),struts2的標籤,struts2的國際化,struts2的文件上傳下載。 把這幾個功能都學會了使用以後,struts2基本上就學完了。因此接下來的文章就是對這幾個功能進行講解。如何使用。而進行就對數據自動封裝和數據類型自動轉型進行講解。java
1、數據自動封裝正則表達式
包括三個方面,而咱們就是從這三個方面下手去講解(註明:該小節是學習該博文http://blog.csdn.net/q547550831/article/details/53323206 寫的很不錯,因此我就本身實現了一遍,你們隨便去哪邊都是同樣的。)架構
1.一、靜態參數封裝(瞭解)jsp
action獲取struts.xml中的參數源碼分析
struts.xml學習
actionspa
結果.net
staticParams攔截器,咱們來看看是怎麼進行封裝的。3d
直接說結論吧,該攔截器會將靜態參數放入值棧中,而action就在值棧中的棧頂,天然就會找到該action中的對應屬性,而後進行賦值了。。想查看源碼,參考該篇博文:http://blog.csdn.net/xtayfjpk/article/details/14133589xml
1.二、動態參數封裝(掌握)
屬性驅動和模型驅動都很是重要,都須要掌握,若是還不會ognl表達式,那麼能夠在學完ognl表達後在回過頭來看便可。
1.2.一、屬性驅動
1.2.1.1普通屬性驅動,提供get、set方法。跟靜態參數封裝同樣,只不過這裏獲取的是表單中的參數,也就是請求發送過來的數據。依靠的攔截器爲params
param.jsp
action
結果就是成功封裝數據並打印出來。
params攔截器
經過查看該博文http://blog.csdn.net/xtayfjpk/article/details/14180981 來了解其源碼,其中該攔截器作的事有兩件,一是對提交的參數進行數據校驗,判斷是否合法,判斷是否合法的標準就是攔截器中的excludeParams參數的正則表達式的值。二是將其封裝到值棧中的棧頂元素中去,而當前action就在棧頂,因此可以將參數放入action中。
1.2.1.二、ognl表達式來封裝數據
封裝對象
params.jsp
action
User.java
結果
分析:
在jsp頁面中的user.name和user.age其實就是ognl表達式,表明着往根(root,值棧valueStack)中存放值,而值棧中的棧頂元素也就是爲當前action,咱們在action中設置user的get、set屬性,便可以讓存進來的值匹配到,進而將對應屬性賦值成功。
封裝List集合。
params.jsp
action
User.java
結果封裝成功
分析:
jsp中的users[0].name、users[0].age、users[1].name、users[1].age就是在給值棧中的users集合進行封裝對象,users[0]表明list集合中的第一個對象,
封裝map集合
map集合和上面的list集合相似,只不過在編寫ognl表達式有些不一樣,users["wuhao"].name、users["wuhao"].age,users["wuhao"]表明的是map中key爲wuhao的value,也就找到了key爲wuhao的User對象,而後在進行封裝數據便可。
1.2.二、模型驅動
1.2.2.一、實現ModelDriven接口和抽象方法
實現ModelDriven接口,提供一個方法getModel(),編寫對象實例。
action
其餘配置省略,就這樣就能夠將表單提交的數據封裝到User對象中了
分析:這有一個專門的攔截器,叫作modelDriven。
源碼分析:http://blog.csdn.net/xtayfjpk/article/details/14004457
其實原理就是,該攔截器將getModel方法返回的結果壓入值棧,而咱們的表單參數會從值棧中從上往下進行查找,天然就直接將參數封裝到User對象中了。
1.二、參數類型自動轉型
上面咱們知道了struts2的方便之處,不用咱們本身手動來獲取請求參數了,struts2中的某些攔截器已經幫咱們所有解決好了,咱們只須要寫get、set方法便可,真是很是方便,不知道你們發現了沒有,從表單元素提交過來的都是String類型的,而咱們在servlet中獲取到表單元素後,獲得的是Object類型,也就是須要咱們本身手動轉型,可是在struts2中,咱們卻不須要,是由於有這麼一個機制,參數類型自動轉型,獲取過來的參數都是String類型的,可是若是咱們須要int型,double型等,都會幫咱們本身轉換。
jsp頁面
action
結果:
分析:所有都自動轉型了,這裏須要注意一點,在使用struts2中的日期自動轉型時,表單中的日期字符串的格式是固定的,必須是2014/12/06,也就是yyyy/mm/dd這樣的格式,其餘格式的話,不可以轉型成功,這對有些人來講,就有些不舒服,使用習慣不同,可是不要緊,struts2可以讓咱們自定義類型轉換器,格式讓咱們本身來決定。
想了解轉換器的實現原理:http://blog.csdn.net/xtayfjpk/article/details/16826649
自定義日期轉換器
只須要兩步便可完成
一、繼承DefaultTypeConverter類,重寫convertValue方法
二、註冊轉換器。也就是該轉換器的做用範圍。局部配置和全局配置。
第一步
第二步
註冊,局部配置
位置:action類同包
名稱:actionClass-conversion.properties
actionClass:action類的類名
conversion.properties:固定名
內容:
屬性=轉換器類的全限定類名
這樣一來,咱們自定義的轉換器就只能在Demo01Action中屬性名爲date身上使用了,超過了該範圍,就會使用struts2默認的轉換器。
註冊,全局配置
位置:src
名稱:xwork-conversion.properties
內容:須要轉換得類=轉換器
全局配置後,全部在struts2中使用Date型的都會用咱們寫的轉換器進行轉換。
2、總結
說完這兩個功能,咱們應該可以感覺到struts2給咱們帶來的一點點便利了,
一、首先,咱們在也不須要手動表單提交的參數了,而且也無需對獲取到的參數進行轉換類型了,這將很是方便,使用起來真的很是爽,直接拿過來用便可。
而咱們經常使用的應該爲動態參數封裝了,其中更爲經常使用的是使用modelDriven,或者直接使用ognl表達式進行封裝。
二、感覺到了struts2架構中的攔截器的做用,確實幫咱們作了很多事情,瞭解了幾個攔截器的功能,好比params,staticParams、modelDriven等的使用。
三、涉及到了一些ognl表達式和值棧的知識,暫時不懂不要緊,後面學到了,在回過頭來看看。