OFBiz是一個非常強大的企業(yè)架構(gòu)體系,這里只描述它MVC方面的內(nèi)容,從MVC的角度去看,OFBiz采用的是Service to Worker模式,大名鼎鼎的Struts 1采用的也是這種架構(gòu)。Service to Worker模式的目標(biāo)就是維護(hù)Action,View和Controller之間的分離。

Controller

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


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

<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內(nèi)置了success和 error這兩個值,這類似于Struts 2。屬性type如果是view表示得到一個頁面,value值對于view-map中的name屬性值。之所以不直接寫上頁面,而是增加view- map,一是為了解耦,二是針對不同的view,可以設(shè)置不同的type等屬性。type屬性很關(guān)鍵,正是這個屬性幫助OFBiz集成不同的顯示層技術(shù)。 common-controller定義了不同的type和其對應(yīng)的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就對應(yīng)view map中的type。實現(xiàn)解耦的類不是Front Controller而是RequestHandler,請求代理類,在這里負(fù)責(zé)讀取controller.xml文件中的對應(yīng)關(guān)系,根據(jù)Front Controller發(fā)送過來的請求,選擇相應(yīng)的業(yè)務(wù)動作進(jìn)行業(yè)務(wù)更新,并且選擇相應(yīng)的視圖View去解析并展示。在Service to Worker模式中,RequestHandler類的角色就是Dispatcher。


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

View Handler:



ViewHandler負(fù)責(zé)選擇相應(yīng)的Renderer,進(jìn)行頁面顯示的準(zhǔn)備工作,對于簡單的頁面技術(shù)如JSP,JspViewHandler直接進(jìn)行處理,不再委托給其他Renderer進(jìn)行處理。AbstractViewHandler的子類中,包含Screen字眼的Handler通常相對較復(fù)雜,見上圖中下面哪些Handler,典型的是ScreenWidgetViewHandler。

View Renderer:



Renderer負(fù)責(zé)具體的顯示工作。


未完待續(xù)