ADF是(Application Development Framework)的简称,它的前身是BC4J。 光听这个名字就知道它是一个end-to-end的框架。和Spring一样它在企业应用架构的每一个层次都提供了它的支持。ADF的架构如下图所示:
在每一层ADF都有它的一些组件。我这次主要想讲讲ADF的data binding,因为它隔离了业务逻辑层和web层,使得两个层次的独立性更强。但是,ADF似乎做得过于复杂,使得很难上手使用。
ADF中关键的数据绑定概念如下:
Data Control:
Data Control是对业务接口的抽象,也就是说所有访问业务对象的方法现在都通过Data Control来进行,这样使得绑定层使用一种方式来访问数据,不论后台的数据对象是种实现。可以把Data Control看做是一种代理机制。
Iterator Bindings and Control Bindings:
Binding是一种轻量级的对象,它的主要目的就是让后台数据和前台显示解藕,这是老生常谈的问题,让我们看看ADF是怎么做的。Iterator Binding 和提供集合对象数据的Data Control合作。 Control Bindings 则提供了一个标准的接口让用户界面可处理集合对象或者调用业务方法。
Binding Containers:
Binding Container 对象记录了某一个用户界面使用了哪些iterator binding、control binding。 有一个XML文件记录了这些内容,在运行时就会根据这个XML来生产一个Binding Container。
Binding Context:
Binding Context 则是比Binding Container更大的一个概念,它包含了所有的Binding Container以及Data Control的信息。
下面介绍一个简单的应用蓝图:
这个应用是这样的, 现在有一个论坛,在这个论坛上有一个页面用来Review 一些Threads并指定一个team回复它,这个页面叫做ReviewThreads.jsp 。 这个页面需要从后台的ForumService来获得数据并指定回复的Team. ForumService是一个ADF的Application Module组件(Application module组件是对业务逻辑的一种抽象,它可以实现为java class,EJB,webservice等等,它也有自己的方法来调用View Object,这里大家只需要认为它是一种业务组件就行了)。另外,这个页面还需要一个所有可选Team的下拉框,这个下来框的数据来自一个web service LookupCodes。
对应每一个业务组件会有一个Data Control包装了该组件的业务方法。在该应用的Binding Context中包含了两个Binding Container, ReviewThreads和UnansweredPostings。前者提供给ReviewThreads.jsp使用,后者则同事支持uix页面(uix是一种基于XML的界面语言),以及Jclient的一个Swing Panel。
ReviewThreads绑定容器包含了以下Binding:
1. 三个指向该应用使用的数据集合的iterator binding。两个由ForumService提供,一个由LookupCodes提供,如图所示
2. 三个支持了界面上元素的Control Binding
首先是一个Attribute control binding 用来在页面上Name输入框中显示Forum名字
其次是一个list binding来支持下拉框
最后是一个range binding用来支持JSTL的 显示Team对象。
3. 一个control binding用来调用ForumService的一个方法,用来指定Team答复Thread.
需要注意的是,control value bindings 是需要通过iterator binding来获得他们的数据。特别是list value binding它同时需要使用两个iterator binding,一个用来取得所有的list中的值,另一个用来提供list中选择的值。
下图介绍了上述的组件在运行时是怎么样配合的。一个Binding Context包含了一个或者多个Data Control和Binding Container。每一个Binding Container会有一个或者多个iterator binding 指定了一个页面使用的数据集合。每一个iterator binding从一个特定的Data control获取及更改数据。Binding Container也会有一个或多个control binding 来支持页面控制。当Control binding需要和数据绑定时,就要一个iterator binding相关联。如果是一个control action binding,比如说和页面上的submit健关联的binding则会要和一个data control 关联用来调用service 层的方法。