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配置文件實現的,配置文件如下所示:

<request-map uri="login">
        
<security https="false" auth="false"/>
        
<event type="java" path="com.xxx.ldap.LdapLoginWorker" invoke="login"/>
        
<response name="success" type="view" value="main"/>
        
<response name="error" type="view" value="login"/>
</request-map>

<view-map name="main" type="screen" page="component://xxx/widget/CustomerScreens.xml#main"/>

<view-map name="login" type="screen" page="component://xxx/widget/CommonScreens.xml#login"/>

request-map的response元素有一個屬性name,這個name理論上可以任意選取,不過OFBiz內置了success和 error這兩個值,這類似于Struts 2。屬性type如果是view表示得到一個頁面,value值對于view-map中的name屬性值。之所以不直接寫上頁面,而是增加view- map,一是為了解耦,二是針對不同的view,可以設置不同的type等屬性。type屬性很關鍵,正是這個屬性幫助OFBiz集成不同的顯示層技術。 common-controller定義了不同的type和其對應的ViewHandler:

    <!-- view handlers -->
    
<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。實現解耦的類不是Front Controller而是RequestHandler,請求代理類,在這里負責讀取controller.xml文件中的對應關系,根據Front Controller發送過來的請求,選擇相應的業務動作進行業務更新,并且選擇相應的視圖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負責具體的顯示工作。


未完待續