Struts今天學習完了,與上個學習項目相比,這個的學習慢了很多,主要還是自己懈怠了。
Struts是一個很經典的MVC架構。
ActionServlet
ActionServlet俗稱前端控制器,對URL進行截取,由截取到的URL擷取到struts-config中配置的以此URL為path的Action。
ActionServlet還利用BeanUtils對request中的parameter的擷取進行了封裝成了一個ActionForm,從而使得擷取參數這個環節簡單了很多。
此類是有Struts進行的實現,無需修改。
ActionForm
ActionForm是對頁面參數擷取進行的封裝。此類編寫要求:屬性要有getter和setter方法,名稱一般與表單上name要求一致。
擷取參數用的方法是getElementsByName,所以擷取到的是一個數組,所以如果要擷取多個(checkbox),那麼在ActionForm中用一個數組接收即可。
如果擷取的是上傳資料,那麼用FormFile參數接收即可,多檔案上傳在後續部落格會進行詳細敘述。
ActionForm的存在,從另一方面減少了開發的工作:轉換器。在ActionForm如果設定參數為int類型的,那麼會直接將頁面參數轉成int類型的,這些都歸功於轉換器。需要注意的是java.util.Date在ActionForm沒有轉換器,所以如果要用這個類型那麼轉成字串或者自訂一個轉換器。
Action
Action就是業務控制器了,主要完成參數的擷取,Model的調用,轉向這三個功能。
在參數擷取方面,有ActionForm收集表單資料,還可以自己通過request進行擷取
在轉向方面,struts提供了ActionForward這個類,可以通過ActionMapping擷取,也可以自己手動new一個。
需要注意的是:Action是單一實例的,所以會存線上程安全問題。
ActionForward
ActionForward封裝了轉向資訊,在配置Action時對forward標籤進行配置(非forward屬性)。
ActionMapping
每一條Action的配置資訊,都以path為key,值為ActionMapping在Map中進行了儲存,在訪問時,如果Map中沒有以path為key的記錄,那麼就返回有unknown屬性的mapping,如果沒有,那麼就將此異常交給tomcat來處理。
關於Action的配置,都在ActionMapping中有所體現,例如type可以用可以用它getType()進行擷取,在ActionServlet中也是通過這個方法擷取到類名從而實現動態載入然後放到Map中的。
ForwardAction
這個是一個Action,如果沒有特別需要,他等價於Action配置forward屬性。
二者區別:
在ActionServlet中,processForward方法是用來判斷是否設定了forward屬性的,如果設定了,那麼就會直接返回,Action不會進行執行個體化。
而ForwardAction的的轉向頁面是配置在parameter中的,而type統一配置成org.apache.struts.actions.ForwardAction,此Action會進行執行個體化。
如果在Action沒有處理,那麼上面兩種方法都沒有區別,但如果需要處理,就要用到後者,建立一個類繼承ForwardAction,然後重寫execute方法,進行完自己的處理後,然後調用父類execute方法,不需要自己寫轉向語句,因為在ForwardAction實現的execute方法中,有轉向操作。
DispatchAction
DispatchAction也是一個Action,它的出現是因為之前的寫法Action的數量太多了,有些Action可能就是3-4行有效代碼,但是就是一個類,對類的維護帶來了不便。
整合DispatchAction的類,不需要重寫execute方法,只需要寫與execute方法同參數同傳回值的一個方法
在配置DispatchAction時,配置一下parameter這個屬性,然後在調用的時候,附帶parameter設定的參數值為要調用的方法名(完全一樣),那麼就會調用到相應的方法上面去了。
其他邊緣知識點:
國際化、異常、模式比對、標籤庫等就不做羅列了,我把他們歸結為用的時候再詳細學習的知識,現在知道就行了。
本文書寫目的旨在在今後再碰到MVC架構時,將新知識點往此架構上靠攏,所以主要是原理上的說明,如果只是實際使用,感覺還是很容易上手的,因為架構的出現帶來的是項目開發的簡單便捷以及規範。
有不全,不對之處歡迎交流~~