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的
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 層的方法。