OFBiz是一個(gè)非常強(qiáng)大的企業(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去處理實(shí)際的請求工作,View層的處理交給
ViewHandler進(jìn)行處理,ViewHandler有很多實(shí)現(xiàn)類,還可以自定義,可以集成很多頁面層顯示技術(shù),如JSP和FreeMarker等,
處理流程如下圖所示:
MVC的解耦的地方就是通過controller.xml配置文件實(shí)現(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元素有一個(gè)屬性name,這個(gè)name理論上可以任意選取,不過OFBiz內(nèi)置了success和
error這兩個(gè)值,這類似于Struts
2。屬性type如果是view表示得到一個(gè)頁面,value值對于view-map中的name屬性值。之所以不直接寫上頁面,而是增加view-
map,一是為了解耦,二是針對不同的view,可以設(shè)置不同的type等屬性。type屬性很關(guān)鍵,正是這個(gè)屬性幫助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。實(shí)現(xiàn)解耦的類不是Front
Controller而是RequestHandler,請求代理類,在這里負(fù)責(zé)讀取controller.xml文件中的對應(yīng)關(guān)系,根據(jù)Front
Controller發(fā)送過來的請求,選擇相應(yīng)的業(yè)務(wù)動(dòng)作進(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代碼就可以得到一個(gè)統(tǒng)一的完整的頁面,展示的業(yè)務(wù)數(shù)據(jù)也可以輕松的獲取。缺點(diǎn)是:不像FreeMarker是一個(gè)純頁面技術(shù),從request和session中得到業(yè)務(wù)數(shù)據(jù),然后直接將其展示處理。Widget技術(shù)將業(yè)務(wù)數(shù)據(jù)獲取和業(yè)務(wù)數(shù)據(jù)展示混在一起,后臺(tái)開發(fā)人員和頁面設(shè)計(jì)人員不能合作分工,甚至只有后臺(tái)設(shè)計(jì)人員才能開發(fā)OFBiz應(yīng)用。OFBiz之所以設(shè)計(jì)自己的頁面技術(shù),與OFBiz實(shí)現(xiàn)ERP/CRM復(fù)雜的業(yè)務(wù)系統(tǒng)時(shí)分不開的。ERP/CRM業(yè)務(wù)系統(tǒng)復(fù)雜多變,模塊眾多。什么樣的框架能夠滿足這樣的系統(tǒng)呢:一是適應(yīng)業(yè)務(wù)變化,第二適合快速開發(fā),第三頁面風(fēng)格能夠一致。OFBiz就是這樣的框架,entity添加減少一個(gè)字段,在OFBiz中只需要在entitymodel中做修改,在輸入頁面,顯示頁面,修改頁面都不用做任何的修改就可以看到變化,而且業(yè)務(wù)邏輯模塊也不用修改就可以對變化的字段進(jìn)行維護(hù),非常的Easy。OFBiz適合快速開發(fā),熟悉了OFBiz開發(fā)的人員,開發(fā)一個(gè)Customer模塊,對用戶進(jìn)行增刪改和復(fù)雜的查詢,一個(gè)小時(shí)足夠,夠快了吧。由于不直接操作html和css代碼,使用OFBiz開發(fā)的各個(gè)模塊都長得一樣,這是很多設(shè)計(jì)人員期望的。言歸正傳,還是從技術(shù)上分析View的設(shè)計(jì)。前面說了通過實(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ù)