Apache OFBiz源码解读之MVC模型

阅读更多
节点解析
request-map

你可以将其理解为controller的配置,如果你了解或使用过struts的配置或springmvc的annotation,就会发现这个定义跟它们是很相似的:
[html] view plain copy print?在CODE上查看代码片派生到我的代码片

     
             
             
             
             
       
 


该元素定义了请求的映射关系。它使用名为uri的属性,表述该uri将要映射的请求。内部包含三个常用的子元素,分别是:security,event,response。

    security:表示该uri应该对应的安全级别(是否应该是https的,是否要进行权限检查)
    event:该请求触发的事件,这个后面在讲解handler的时候再谈
    response:指定响应的配置

view-map
一个常见的view-map配置:
[html] view plain copy print?在CODE上查看代码片派生到我的代码片

     


包含的属性:

    name:当前view-map的名称,通常被子元素的value属性引用
    type:其表示用什么技术展示视图,通常为screen,该值其实引用的是后面要讲解的handler
    page:指定真实用于前端展示的视图布局文件

handler
在 OFBiz中大致会划分两种类型的handler:event和screen。其实个人认为此处将handler理解为engine更为贴切一点,因为叫 handler很容易跟业务联系到一起,而如果称之为engine则可以完全跟业务隔离开来,它只是纯技术组件而已。看看handler的定义就很容易理 解了:
[html] view plain copy print?在CODE上查看代码片派生到我的代码片

     
         
         
         
         
         
         
         
         
         
         
     
         
         
         
         
         
         
         
         
         
         


handler包含的属性:

    name:指定handler的名称,通常会被子元素的event的type属性以及的type属性所引用
    type:有两种取值:request和view。request应对的是中的event的处理器;view对应的是的处理器
    class:指定当前处理器实现类的完全限定名

mvc串接
下面我们以OFBiz收到一个请求为示例,展示其利用MVC模型处理请求的完整过程:
首 先我们假设OFBiz web container收到请求:createCreditCardAndPostalAddress。然后OFBiz会根据每个app下面的 controller配置文件中request-map定义,查找并匹配uri为createCreditCardAndPostalAddress的映 射节点(就是上文中讲解request-map使用的节点)。
[html] view plain copy print?在CODE上查看代码片派生到我的代码片

     


然后根据其子元素security的配置,对其进行安全检查:
[html] view plain copy print?在CODE上查看代码片派生到我的代码片

     


因为有event元素,那么此处会触发一个“事件”(注意,不一定会有event元素)。这里是通过ofbiz的ServiceEngine来调用一个service:
[html] view plain copy print?在CODE上查看代码片派生到我的代码片

     


调用完该service后,根据service执行的结果,匹配不同的响应视图:
[html] view plain copy print?在CODE上查看代码片派生到我的代码片

     
     


这里(也是通常情况下)有两种不同的响应配置:success,error。而且他们的响应方式不同,我们分开来看:

如 果event触发调用createCreditCardAndAddress服务的返回结果为success,那么将触发一个请求(type为 request表示再次触发一个请求,但这个请求是服务端的请求,有点像servlet里的forward动作),uri为 finalizeOrder(它是另一个request-map的定义):
[html] view plain copy print?在CODE上查看代码片派生到我的代码片

     


其语义为:完成订单创建。

如 果event触发调用createCreditCardAndAddress服务的返回结果为error,那么它将会向浏览器展示一个视图(type为 view),而该视图的名称为:billsetting。那接下来ofbiz就去查找名为:billsetting的view-map,查找到如下的结 果:
[html] view plain copy print?在CODE上查看代码片派生到我的代码片

     


发 现它是一个widget配置(type为screen表示OFBiz中采用的一种xml的widget),而该配置的路径 为:component://order/widget/ordermgr/OrderEntryOrderScreens.xml文件中名称为 BillSettings的screen。然后就利用名为screen的handler,来解析该screen配置:
[html] view plain copy print?在CODE上查看代码片派生到我的代码片

     

screen

上面提到ofbiz在渲染视图的时候,采用了一个元素名为screen的配置:
[html] view plain copy print?在CODE上查看代码片派生到我的代码片

     
       
 
             
                 
                 
               

你可能感兴趣的:(mvc)