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根据请求的类型分发给具体的处理者
返回结果