轉 OFBiz的MVC框架


 

ofbiz是一個非常強大的企業架構體系,這里只描述它MVC方面的內容,從MVC的角度去看,ofbiz采用的是Service to Worker模式,大名鼎鼎的Struts 1采用的也是這種架構。

Service to Worker模式的目標就是維護Action,View和Controller之間的分離。


Controller

ControlServlet是Front Controller(前端控制器),接收所有的請求,是請求的入口,執行一些的預處理后,交由RequestHandler去處理實際的請求工作,View層的處理交給ViewHandler進行處理,ViewHandler有很多實現類,還可以自定義,可以集成很多頁面層顯示技術,如JSP和FreeMarker等,處理流程如下圖所示:

 


MVC的解耦的地方就是通過controller.xml配置文件實現的,配置文件如下所示:

[html] view plain copy
  1. <request-map uri="login">    
  2.   <security https="false" auth="false"/>    
  3.   <event type="java" path="com.xxx.ldap.LdapLoginWorker" invoke="login"/>    
  4.   <response name="success" type="view" value="main"/>    
  5.   <response name="error" type="view" value="login"/>    
  6. </request-map>    
  7.     
  8. <view-map name="main" type="screen" page="component://xxx/widget/CustomerScreens.xml#main"/>    
  9. <view-map name="login" type="screen" page="component://xxx/widget/CommonScreens.xml#login"/>    


request-map的response元素有一個屬性name,這個name理論上可以任意選取,不過ofbiz內置了success和error這兩個值,這類似於Struts2。

屬性type如果是view表示得到一個頁面,value值對於view-map中的name屬性值。之所以不直接寫上頁面,而是增加view-map,    

  • <handler name="screen" type="view" class="org.ofbiz.widget.screen.ScreenWidgetViewHandler"/>    
  • <handler name="screenfop" type="view" class="org.ofbiz.widget.screen.ScreenFopViewHandler"/>    
  • <handler name="screenxml" type="view" class="org.ofbiz.widget.screen.ScreenXmlViewHandler"/>    
  • <handler name="screentext" type="view" class="org.ofbiz.widget.screen.ScreenTextViewHandler"/>    
  • <handler name="jsp" type="view" class="org.ofbiz.webapp.view.JspViewHandler"/>    
  • <handler name="ftl" type="view" class="org.ofbiz.webapp.ftl.FreeMarkerViewHandler"/>       
  • <handler name="http" type="view" class="org.ofbiz.webapp.view.HttpViewHandler"/>  


這里的name就對應view map中的type。實現解耦的類不是FrontController而是RequestHandler,請求代理類,在這里負責讀取controller.xml文件中的對應關系,根據FrontController發送過來的請求,選擇相應的業務動作進行業務更新,並且選擇相應的視圖View去解析並展示。在Service to Worker模式中,RequestHandler類的角色就是Dispatcher。


View
ofbiz支持很多類型的頁面展示技術,JSP/FreeMarker/Velocity/PDF/Widget等。

ofbiz最常用的就是Widget和FreeMarker。
Widget是ofbiz自己特有的頁面技術,好處就是可以不用寫任何html和css代碼就可以得到一個統一的完整的頁面,展示的業務數據也可以輕松的獲取。缺點是:不像FreeMarker是一個純頁面技術,從request和session中得到業務數據,然后直接將其展示處理。Widget技術將業務數據獲取和業務數據展示混在一起,后台開發人員和頁面設計人員不能合作分工,甚至只有后台設計人員才能開發ofbiz應用。
ofbiz之所以設計自己的頁面技術,與ofbiz實現ERP/CRM復雜的業務系統時分不開的。ERP/CRM業務系統復雜多變,模塊眾多。什么樣的框架能夠滿足這樣的系統呢:一是適應業務變化,第二適合快速開發,第三頁面風格能夠一致。OFBiz就是這樣的框架,entity添加減少一個字段,在OFBiz中只需要在entitymodel中做修改,在輸入頁面,顯示頁面,修改頁面都不用做任何的修改就可以看到變化,而且業務邏輯模塊也不用修改就可以對變化的字段進行維護,非常的Easy。
ofbiz適合快速開發,熟悉了ofbiz開發的人員,開發一個Customer模塊,對用戶進行增刪改和復雜的查詢,一個小時足夠,夠快了吧。由於不直接操作html和css代碼,使用ofbiz開發的各個模塊都長得一樣,這是很多設計人員期望的。言歸正傳,還是從技術上分析View的設計。前面說了通過實現ViewHandler接口,ofbiz集成了不同的頁面技術以供選擇。相關的類關系圖如下:

View Handler:



ViewHandler負責選擇相應的Renderer,進行頁面顯示的准備工作,對於簡單的頁面技術如JSP,JspViewHandler直接進行處理,不再委托給其他Renderer進行處理。AbstractViewHandler的子類中,包含Screen字眼的Handler通常相對較復雜,見上圖中下面哪些Handler,典型的是ScreenWidgetViewHandler。

View Renderer:



Renderer負責具體的顯示工作。


Model
ofbiz的實體引擎功能類似於其他的O-R Mapper,但是ofbiz的實體引擎不僅強大,而且靈活,程序員不需要JDBC知識,不用寫SQL代碼。基本上,實體引擎的封裝能夠解決大部分的數據庫操作,同時也提供了給你寫SQL代碼,實現復雜SQL查詢的空間。
實體引擎采用了不少核心J2EE設計模型,如值對象、代表、助手等模式,用戶的API接口比較友好。

=============================================




web請求執行流程
  1. 瀏覽器發起請求
  2. ControlServlet收到請求,准備若干預備數據后將請求交由RequestHandler
  3. RequestHandler進行安全檢查
  4. RequestHandler根據請求的類型分發給具體的處理者
  5. 返回結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM