OFBiz的MVC框架

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等, 处理流程如下图所示:

OFBiz的MVC框架_第1张图片

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这两个值,这类似于Struts 2。属性type如果是view表示得到一个页面,value值对于view-map中的name属性值。之所以不直接写上页面,而是增加view- map,一是为了解耦,二是针对不同的view,可以设置不同的type等属性。type属性很关键,正是这个属性帮助OFBiz集成不同的显示层技术。 common-controller定义了不同的type和其对应的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就对应view map中的type。实现解耦的类不是Front Controller而是RequestHandler,请求代理类,在这里负责读取controller.xml文件中的对应关系,根据Front Controller发送过来的请求,选择相应的业务动作进行业务更新,并且选择相应的视图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:

OFBiz的MVC框架_第2张图片

ViewHandler负责选择相应的Renderer,进行页面显示的准备工作,对于简单的页面技术如JSP,JspViewHandler直接进行处理,不再委托给其他Renderer进行处理。AbstractViewHandler的子类中,包含Screen字眼的Handler通常相对较复杂,见上图中下面哪些Handler,典型的是ScreenWidgetViewHandler。

View Renderer:

OFBiz的MVC框架_第3张图片

Renderer负责具体的显示工作。

你可能感兴趣的:(框架,jsp,mvc,freemarker,struts,service)