前篇文章對struts2的一個入門,重點是對struts2的架構圖有一個大概的了解即可,之后的幾篇文章,就是細化struts2,將struts2中的各種功能進行梳理,其實學完之后,對struts2的使用不外乎這幾點,參數自動封裝,攔截器的使用,數據校驗,ognl表達(值棧和actionContext的講解),struts2的標簽,struts2的國際化,struts2的文件上傳下載。 把這幾個功能都學會了使用之后,struts2基本上就學完了。所以接下來的文章就是對這幾個功能進行講解。如何使用。而進行就對數據自動封裝和數據類型自動轉型進行講解。
一、數據自動封裝
包括三個方面,而我們就是從這三個方面下手去講解(注明:該小節是學習該博文http://blog.csdn.net/q547550831/article/details/53323206 寫的很不錯,所以我就自己實現了一遍,大家隨便去哪邊都是一樣的。)

1.1、靜態參數封裝(了解)
action獲取struts.xml中的參數
struts.xml
action

結果
![]()
staticParams攔截器,我們來看看是怎么進行封裝的。


直接說結論吧,該攔截器會將靜態參數放入值棧中,而action就在值棧中的棧頂,自然就會找到該action中的對應屬性,然后進行賦值了。。想查看源碼,參考該篇博文:http://blog.csdn.net/xtayfjpk/article/details/14133589
1.2、動態參數封裝(掌握)
屬性驅動和模型驅動都非常重要,都需要掌握,如果還不會ognl表達式,那么可以在學完ognl表達后在回過頭來看即可。
1.2.1、屬性驅動
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.2、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.2、模型驅動
1.2.2.1、實現ModelDriven接口和抽象方法
實現ModelDriven接口,提供一個方法getModel(),編寫對象實例。
action

其他配置省略,就這樣就可以將表單提交的數據封裝到User對象中了
分析:這有一個專門的攔截器,叫做modelDriven。


源碼分析:http://blog.csdn.net/xtayfjpk/article/details/14004457
其實原理就是,該攔截器將getModel方法返回的結果壓入值棧,而我們的表單參數會從值棧中從上往下進行查找,自然就直接將參數封裝到User對象中了。
1.2、參數類型自動轉型
上面我們知道了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
自定義日期轉換器
只需要兩步即可完成
1、繼承DefaultTypeConverter類,重寫convertValue方法
2、注冊轉換器。也就是該轉換器的作用范圍。局部配置和全局配置。
第一步
第二步
注冊,局部配置
位置:action類同包
名稱:actionClass-conversion.properties
actionClass:action類的類名
conversion.properties:固定名
內容:
屬性=轉換器類的全限定類名
這樣一來,我們自定義的轉換器就只能在Demo01Action中屬性名為date身上使用了,超過了該范圍,就會使用struts2默認的轉換器。
注冊,全局配置
位置:src
名稱:xwork-conversion.properties
內容:需要轉換得類=轉換器
全局配置后,所有在struts2中使用Date型的都會用我們寫的轉換器進行轉換。
二、總結
說完這兩個功能,我們應該能夠感受到struts2給我們帶來的一點點便利了,
1、首先,我們在也不需要手動表單提交的參數了,並且也無需對獲取到的參數進行轉換類型了,這將非常方便,使用起來真的非常爽,直接拿過來用即可。
而我們常用的應該為動態參數封裝了,其中更為常用的是使用modelDriven,或者直接使用ognl表達式進行封裝。
2、感受到了struts2架構中的攔截器的作用,確實幫我們做了不少事情,了解了幾個攔截器的功能,比如params,staticParams、modelDriven等的使用。
3、涉及到了一些ognl表達式和值棧的知識,暫時不懂沒關系,后面學到了,在回過頭來看看。
