ofbiz是一個很是強大的企業架構體系,這裏只描述它MVC方面的內容,從MVC的角度去看,ofbiz採用的是Service to Worker模式,大名鼎鼎的Struts 1採用的也是這種架構。css
Service to Worker模式的目標就是維護Action,View和Controller之間的分離。html
Controller前端
ControlServlet是Front Controller(前端控制器),接收全部的請求,是請求的入口,執行一些的預處理後,交由RequestHandler去處理實際的請求工做,View層的處理交給ViewHandler進行處理,ViewHandler有不少實現類,還能夠自定義,能夠集成不少頁面層顯示技術,如JSP和FreeMarker等,處理流程以下圖所示:java
MVC的解耦的地方就是經過controller.xml配置文件實現的,配置文件以下所示:程序員
[html] view plaincopyweb
<request-map uri="login"> 數據庫
<security https="false" auth="false"/> apache
<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這兩個值,這相似於Struts2。
屬性type若是是view表示獲得一個頁面,value值對於view-map中的name屬性值。之因此不直接寫上頁面,而是增長view-map,一是爲了解耦,二是針對不一樣的view,能夠設置不一樣的type等屬性。type屬性很關鍵,正是這個屬性幫助ofbiz集成不一樣的顯示層技術。common-controller定義了不一樣的type和其對應的ViewHandler:
[html] view plaincopy
<!-- 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。實現解耦的類不是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請求執行流程
瀏覽器發起請求
ControlServlet收到請求,準備若干預備數據後將請求交由RequestHandler
RequestHandler進行安全檢查
RequestHandler根據請求的類型分發給具體的處理者
返回結果