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這兩個值,這類似於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等。
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查詢的空間。


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