通过代码获取AM的实例
2009-12-26 10:32
288 查看
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"
示例代码:
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(JmxDataControl@adfmeta_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(HadfFrameworkAMDataControl@hand_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传进去。
示例代码:
3)通过DCBindingContainer获取
通过页面定义文件(PageDef)在DataBinding.cpx中定义的对应id,查找该PageDef的DCBindingContainder,再从该Container中调用getDataControl().getDataProvider()方法获取对应的AM实例。由于该方法是从DCBindingContainer中获取,因此不会出现2)中提到的问题。
示例代码:
1)基于AM的Configration创建
使用Configuration.createRootApplicationModule(serviceDefinition, serviceConfig)代码进行创建,接收的两个参数分别为:
serviceDefinition: AM的package路径,例如"hand.hadf.common.model.services.HadfFrameworkAM"
serviceConfig:使用AM中配置的Configuration的名称"HadfFrameworkAMLocal"
示例代码:
…… private String serviceDefinition = "hand.hadf.arpt.model.services.ArptAM"; private String serviceConfig = "ArptAMLocal"; private static ArptAM arptAM; …… /** * 获取AM实例 */ private ArptAM getArptService() { ArptAM service = (ArptAM)Configuration.createRootApplicationModule(serviceDefinition, serviceConfig); return service; } ……
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(JmxDataControl@adfmeta_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(HadfFrameworkAMDataControl@hand_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传进去。
示例代码:
…… HadfFrameworkAM hadfFrameworkAM = (HadfFrameworkAM)BindingContext.getDataSource("HadfFrameworkAMDataControl@hand_hadf_common_view_DataBindings_cpx").getDataProvider() ……
3)通过DCBindingContainer获取
通过页面定义文件(PageDef)在DataBinding.cpx中定义的对应id,查找该PageDef的DCBindingContainder,再从该Container中调用getDataControl().getDataProvider()方法获取对应的AM实例。由于该方法是从DCBindingContainer中获取,因此不会出现2)中提到的问题。
示例代码:
…… private static synchronized HadfFrameworkAM getHadfAMInstance() { BindingContext bindingContext = (BindingContext)JSFUtils.getExpressionValue("#{data}"); DCBindingContainer container = bindingContext.findBindingContainer(bindingContainerName); Object dataProvider = container.getDataControl().getDataProvider(); if (dataProvider == null) { container.refresh(DCBindingContainer.PREPARE_MODEL); dataProvider = container.getDataControl().getDataProvider(); } HadfFrameworkAM hadfFrameworkAM = (HadfFrameworkAM)dataProvider; return hadfFrameworkAM; } ……
相关文章推荐
- JavaWeb将数据包装成JSON以及JSP通过ajax对JSON的获取与解析(代码实例)
- VC实例分析:VC++通过汇编获取代码运行时间
- JavaWeb将数据包装成JSON以及JSP通过ajax对JSON的获取与解析(代码实例)
- PHP通过文件路径获取文件名的实例代码
- Flex通过JS获取客户端IP和计算机名的实例代码
- Flex通过JS获取客户端IP和计算机名的实例代码
- JS和jQuery通过this获取html标签中的属性值(实例代码)
- PHP通过IP 获取 地理位置(实例代码)
- Java反射代码--01.通过类名称加载一个类并且获取当前类实例
- JavaWeb将数据包装成JSON以及JSP通过ajax对JSON的获取与解析(代码实例)
- Java反射之通过反射获取一个对象的方法信息(实例代码)
- 通过拖动将商品添加到购物车效果代码实例
- JQuery 获取json数据$.getJSON方法的实例代码
- spring mvc DispatcherServlet详解之三---request通过ModelAndView中获取View实例的过程
- js获取location.href的参数实例代码
- 网页爬虫的最简C/C++程序代码示例------先通过列表获取所有博文id, 然后遍历所有博文id
- cocos2d-x 2.0通过CCAnimation实例获取CCSpriteFrame
- javascript获取鼠标位置部分的实例代码(兼容IE,FF)
- C#中通过API实现的打印类 实例代码
- S2SH框架中,Spring通过注解获取bean实例