struts2(二) 表單參數自動封裝和參數類型自動轉換

    前篇文章對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表達式和值棧的知識,暫時不懂不要緊,後面學到了,在回過頭來看看。

相關文章
相關標籤/搜索