2009年4月18日星期六

实现ADF应用集成

概述
本文主要描述在ADF开发中如果实现不同应用之间的集成。
场景:
在开发过程中,为了降低开发难度和风险,有时会采用在基础框架应用外新建应用进行开发,待新应用开发完成后,再将其集成到基础框架应用中。这里将以howtoappsintegration1和howtoappsintegration2两个应用为例,说明如何实现系统之间的集成。

实现
1、分别创建新应用howtoappsintegration1和howtoappsintegration2,两个应用都有Model项目和ViewController项目。
2、我们将howtoappsintegration2应用集成到howtoappsintegration1应用中。在howtoappsintegration1应用中打开howtoappsintegration2应用的Model项目,这里名为Model2。此时,在howtoappsintegration1应用中,应该包含Model,Model2和ViewController三个项目,由于在一个应用中只能包含一个ViewController项目(多个ViewController项目Runtime时会报异常)。
3、修改howtoappsintegration1中的ViewController项目的Dependencies,同时依赖于Model和Model2两个项目,在Data Control面板中可以看到包含两个Data Control。



4、在完成了上述步骤后,我们就可以开始将ViewController项目进行合并。打开两个应用所在的文件夹,首先拷贝howtoappsintegration2应用的task flow到howtoappsintegration1的对应目录下(一般task flow存在于public_html中的WEB-INF文件夹中),在这里为app2-task-flow.xml。
5、在Jdeveloper中刷新Application Navigator面板,可以看到该task flow已经存在于对应目录下,打开该task flow。发现该task flow中的页面包含叉号,说明页面出错或不存在,这里是由于不存在,点开该task flow的source,查看该页面在howtoappsintegration2应用的存放目录。






<?xml version="1.0" encoding="UTF-8" ?>


<adfc-config xmlns="http://xmlns.oracle.com/adf/controller" version="1.2">


<task-flow-definition id="app2-task-flow">


<default-activity>Jobs</default-activity>


<view id="Jobs">


<page>/Jobs.jspx</page>


</view>


</task-flow-definition>

</adfc-config>


6、通过步骤5我们发现该页面直接存在于其public_html目录下,拷贝该页面到howtoappsintegration1应用中,在这里也拷贝到了public_html目录下。完成后刷新Jdeveloper的刷新Application Navigator面板,此时再次查看app2-task-flow.xml的source,发现错误消失。
7、在howtoappsintegration1应用中打开上步中拷进来的页面,即Jobs.jspx,点击其Source,发现有非常多的警告,查看后发现,确实了页面的绑定信息,即缺少了页面对应的PageDef文件(如果页面使用了模板,还需要根据实际情况修改模板信息或删除模板)。
8、找到howtoappsintegration2应用中Jobs.jspx页面绑定文件,一般在adfmsrc目录下,这里名为JobsPageDef.xml,将其拷贝到howtoappsintegration1应用的对应目录下。完成后刷新Jdeveloper的刷新Application Navigator面板,此时再次查看Jobs.jspx页面的source,发现警告没有消失,此时虽然PageDef已经存在于该应用中,但是由于没有在DataBindings.cpx中指定页面和页面绑定信息的关联信息,因此页面仍然无法找到其绑定信息。
9、在howtoappsintegration1应用中打开DataBindings.cpx文件,我们直接修改其Source。需要修改的地方主要有:
(1)dataControlUsages:定义dataControl信息
(2)pageDefinitionUsages:定义页面绑定信息
(3)pageMap:定义页面和页面绑定的关联信息
在这里将该文件进行如下修改:







<?xml version="1.0" encoding="UTF-8" ?>


<Application xmlns="http://xmlns.oracle.com/adfm/application" version="11.1.1.51.88" id="DataBindings"


SeparateXMLFiles="false" Package="howto.howtoappsintegration1.view" ClientType="Generic">


<pageMap>


<page path="/Employees.jspx" usageId="howto_howtoappsintegration1_view_EmployeesPageDef"/>


<page path="/Jobs.jspx" usageId="howto_howtoappsintegration1_view_JobsPageDef"/>


</pageMap>


<pageDefinitionUsages>


<page id="howto_howtoappsintegration1_view_EmployeesPageDef"


path="howto.howtoappsintegration1.view.pageDefs.EmployeesPageDef"/>


<page id="howto_howtoappsintegration1_view_JobsPageDef"


path="howto.howtoappsintegration1.view.pageDefs.JobsPageDef"/>


</pageDefinitionUsages>


<dataControlUsages>


<BC4JDataControl id="AppModuleDataControl" Package="howto.howtoappsintegration1.model.services"


FactoryClass="oracle.adf.model.bc4j.DataControlFactoryImpl" SupportsTransactions="true"


SupportsFindMode="true" SupportsRangesize="true" SupportsResetState="true"


SupportsSortCollection="true" Configuration="AppModuleLocal" syncMode="Immediate"


xmlns="http://xmlns.oracle.com/adfm/datacontrol"/>


<BC4JDataControl id="AppModuleDataControl1" Package="howto.howtoappsintegration2.model.services"


FactoryClass="oracle.adf.model.bc4j.DataControlFactoryImpl" SupportsTransactions="true"


SupportsFindMode="true" SupportsRangesize="true" SupportsResetState="true"


SupportsSortCollection="true" Configuration="AppModuleLocal" syncMode="Immediate"


xmlns="http://xmlns.oracle.com/adfm/datacontrol"/>


</dataControlUsages>

</Application>


10、保存,在howtoappsintegration1应用中再次打开Jobs.jspx页面,点击查看source,发现页面绑定信息已经找到(或者通过点击Binding,通过关联链接进而点击查看PageDef信息)。



11、虽然页面文件已经找到,但是在页面的source中仍然存在一些警告信息,这是由于该页面中的属性绑定到了backing scope的managed bean(或称为backingbean)上,此时此managed bean尚未存在于该应用中。根据source中managed bean的名称在howtoappsintegration2应用中的adfc-config.xml中找到该managed bean的路径和名称,将其拷贝到howtoappsintegration1应用的对应目录下(一般存在于src目录下),此时刷新Application Navigator后,查看到该managed bean,务必选中该manged bean,右键点击rebuild,否则在下步中将有可能无法看到该类(如果package的路径不同,有可能需要打开代码手动修改该路径,修改后重新rebuild)。

12、完成后将其按照source中的名字定义到howtoappsintegration1应用中的adfc-config.xml中,这里名为backing_Jobs,Scope为backing scope。



13、此时再次查看howtoappsintegration1应用中的Jobs.jspx的source,发现绑定到managed bean中属性的信息上的警告消失,此时所有拷贝和修改已经基本完成。
14、保存应用,运行拷贝进来的task flow,进行测试。

最终运行页面:




总结:
应用集成是一个看似容易却相对琐碎和比较容易出问题的环节,所以在进行应用集成的过程中,尽量按照步骤,按部就按地进行,切忌将所有的内容全部拷贝然后再去修改配置,如果是这样的话,出了问题就将非常难以排查,尤其是在需要多人协同开发的项目上(这里建议的最佳实践就是由专人负责应用集成)。一般而言,只要细心,按照步骤进行,是不会有问题的。下面是在集成过程中需要特别注意的几点:
(1)文件一定要拷贝完整
(2)注意library是否正确,数据库连接是否正确
(3)DataBinding.cpx文件修改一定要小心,根据需要注册Data Control到该文件
(4)Managed Bean拷贝完成后一定要注意其Package路径,并进行rebuild
(5)在最终集成到的应用中,一定只能包含一个ViewController项目(Model项目可以有多个)。
(6)如果task flow中有用到了method call,有可能要根据实际情况重新拖拽。


相关代码请查看:
howtoappsintegration.rar

0 评论:

发表评论