1. 程式人生 > >Struts2學習(二)———— 表單引數自動封裝和引數型別自動轉換

Struts2學習(二)———— 表單引數自動封裝和引數型別自動轉換

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