通过代码获取AM的实例 - oracle soa weblogic porlet - 面向对象技术开发

面向对象技术开发

会员投稿 投稿指南 站长资讯通告:
您的位置: 首页 > Web开发 > Oracle SOA > 正文

通过代码获取AM的实例

来源: 阅读:

Oracle ADF提供的ADF BC为我们的开发提供了极大的便利,其提供的声明式开发方式可以满足大部分业务需求,但有时我们可能需要在代码中获取AM的实例,完成一些特殊逻辑的处理,在ViewController中使用代码获取AM的实例的方式有如下几种:

 

 1)基于AM的Configration创建
使用Configuration.createRootApplicationModule(serviceDefinition, serviceConfig)代码进行创建,接收的两个参数分别为:
   serviceDefinition: 
AM的package路径,例如"hand.hadf.common.model.services.HadfFrameworkAM"
   
serviceConfig:使用AM中配置的Configuration的名称"HadfFrameworkAMLocal"

 

示例代码:

 

[java] view plaincopy
 
  1. ……  
  2. private String serviceDefinition = "hand.hadf.arpt.model.services.ArptAM";  
  3. private String serviceConfig = "ArptAMLocal";  
  4. private static ArptAM arptAM;  
  5. ……  
  6. /** 
  7.  * 获取AM实例 
  8.  */  
  9. private ArptAM getArptService() {  
  10.   ArptAM service =  
  11.     (ArptAM)Configuration.createRootApplicationModule(serviceDefinition,  
  12.                                                       serviceConfig);  
  13.   return service;  
  14. }  
  15. ……  

 

 

2)通过BindingContext获取
在BindingContext中可以直接获取当前DataBinding.cpx中定义的DataControl,使用BindingContext对象的findDataSource方法,但需注意的是,此处的findDataSource方法的参数为DataBinding.cpx中注册的dataControlUsages的对应的BC4JDataControl的id,例如:
<dataControlUsages>
    <BC4JDataControl id="HadfFrameworkAMDataControl" Package="hand.hadf.common.model.services"
                     FactoryClass="oracle.adf.model.bc4j.DataControlFactoryImpl" SupportsTransactions="true"
                     SupportsFindMode="true" SupportsRangesize="true" SupportsResetState="true"
                     SupportsSortCollection="true" Configuration="HadfFrameworkAMLocal" syncMode="Immediate"
                     xmlns="
http://xmlns.oracle.com/adfm/datacontrol"/>
  </dataControlUsages>
在通过BindingContext查询DataControl从而获取其DataProvider的时候,需要使用如下方法获取AM的实例BindingContext.getDataSource("").getDataProvider();
需要特别注意的是,如果在同一个应用中包含多个DataBinding,在使用该方法查找DataControl的时候如果直接按id进行查找可能会报错,原因是在同一个应用中,如果包含多个DataBinding,那么在应用启动部署时会将这些DataBinding的全部put到当前应用的相关配置中
<BindingContext><put>[39] BindingContext.put([email protected]_oracle_sysman_emai_adf_DataBindings_cpx,oracle.adf.model.binding.DCDataControlReference )
<BindingContext><put>[40] BindingContext.put( ADFConnectionsPageDef,oracle.adf.model.binding.DCBindingContainerReference )

<BindingContext><put>[41] BindingContext.put( BC4JConfigPageDef,oracle.adf.model.binding.DCBindingContainerReference )
<BindingContext><put>[45] BindingContext.put([email protected]_hadf_common_view_DataBindings_cpx,oracle.adf.model.binding.DCDataControlReference )
<BindingContext><put>[46] BindingContext.put( hand_hadf_common_view_indexPageDef,oracle.adf.model.binding.DCBindingContainerReference )
然而在查找该id对应的DataControl时就无法知晓是从哪个DataBinding中获取,在获取时就会报错,解决该问题的方法就是在查找DataControl时,在调用findDataSource("")方法时,将对应的DataBinding的Key传进去。


示例代码:

[java] view plaincopy
 
  1. ……  
  2. HadfFrameworkAM hadfFrameworkAM =   (HadfFrameworkAM)BindingContext.getDataSource("[email protected]_hadf_common_view_DataBindings_cpx").getDataProvider()  
  3. ……  
 

 

 

3)通过DCBindingContainer获取
通过页面定义文件(PageDef)在DataBinding.cpx中定义的对应id,查找该PageDef的DCBindingContainder,再从该Container中调用getDataControl().getDataProvider()方法获取对应的AM实例。由于该方法是从DCBindingContainer中获取,因此不会出现2)中提到的问题。


示例代码:

[java] view plaincopy
 
  1. ……  
  2. private static synchronized HadfFrameworkAM getHadfAMInstance() {  
  3.   BindingContext bindingContext =  
  4.     (BindingContext)JSFUtils.getExpressionValue("#{data}");  
  5.   DCBindingContainer container =  
  6.     bindingContext.findBindingContainer(bindingContainerName);  
  7.   Object dataProvider = container.getDataControl().getDataProvider();  
  8.   if (dataProvider == null) {  
  9.     container.refresh(DCBindingContainer.PREPARE_MODEL);  
  10.     dataProvider = container.getDataControl().getDataProvider();  
  11.   }  
  12.   HadfFrameworkAM hadfFrameworkAM = (HadfFrameworkAM)dataProvider;  
  13.   return hadfFrameworkAM;  
  14. }  
  15. ……  

 

 

Tags:实例 代码
相关文章列表: