我們通過上圖可以看出,兩者流程基本一致,所不同的主要是兩點:RoR的Action Pack和Active Record,下面我們就這兩點解釋如下:Action PackAction Pack是RoR的MVC組件框架:View templates,相當于Struts中的Jsp;URL routing,相當于struts-config.xml流程配置,RoR不是使用XML配置,而是作為腳本代碼,這也是一些人吹噓的RoR無繁多XML配置真相所在,其實,XML也是一種腳本,從某種意義上來說:XML比語言腳本更簡單易寫(至少語法不多)。ActionController,初看相當于struts的DispatchAction,但是因為其包含業務邏輯,而我們在java中是不推薦在在控制層action中寫業務邏輯的。ActionController功能在于:RoR可以將瀏覽器的請求直接映射到ActionController類的方法上,這有些類似Struts中的DispatchAction,但是,在Java中,業務邏輯是不推薦寫在表現層的控制類中的,控制類只是負責前后臺流程協調,是一種Mediator模式實現,不應該讓其加入更多職責;在JF中,業務邏輯是寫在Service類中,JF通過自己的命令服務調用模式,也可以直接將瀏覽器的請求直接映射到Service類的方法上,例如,調用http://localhost//MyWeb/abc.do?method=xxx,將直接激活Service類的xxx方法,程序員直接編寫xxx方法內容即可。RoR的Filters過濾器也是Action Pack的一個部分,主要用來實現一些通用功能的動態插入,這在JF中是通過AOP攔截器和Decorator模式來實現的,見AOP vs Decorator 一文,在JiveJdon3.0中,我們通過攔截器實現了組件方法權限訪問、以及緩存等通用功能。Action Pack中還有Helpers功能相當于Struts的標簽庫,它可以把Model/ActionForm和Action以及Html連接在一起,下面是RoR的Helpers如:<formaction="save_person"method="post">
Active Record其實類似JF中Domain Object + Dao,也就是將Dao中對數據庫的CRUD方法和Domain Object整合在一起, 我們知道,Dao模式本質是橋模式,通過Dao可以將不同的數據庫訪問實現分離,并且在運行時組合,但是,Martin Fowler將Dao從Domain Object分離出去的對象稱為貧血對象。他的這個觀點筆者認為不是從技術觀點,而是從領域建模角度出發的,其實從技術觀點講,將Dao從Domain Object中分離在設計上非常靈活,例如使用JF開發的JiveJdon3.0中,我們就可以在Dao層中使用Decorator模式(過濾器)加入一層緩存,這樣,雖然我們Dao層使用的SQL實現,我們也是可以實現持久層緩存,JiveJdon3.0整個Dao層設計相當于一個Hibernate的微型(或者說輕量化),好處是:JiveJdon3.0這樣實現的緩存可以被各層如表現層直接訪問,減少路徑,提升運行性能。新聞熱點
疑難解答