我荒廢的今日,正是昨日殞身之人祈求的明日
ADF是(Application Development Framework)的簡(jiǎn)稱(chēng),它的前身是BC4J。 光聽(tīng)這個(gè)名字就知道它是一個(gè)end-to-end的框架。和Spring一樣它在企業(yè)應(yīng)用架構(gòu)的每一個(gè)層次都提供了它的支持。ADF的架構(gòu)如下圖所示: 在每一層ADF都有它的一些組件。我這次主要想講講ADF的data binding,因?yàn)樗綦x了業(yè)務(wù)邏輯層和web層,使得兩個(gè)層次的獨(dú)立性更強(qiáng)。但是,ADF似乎做得過(guò)于復(fù)雜,使得很難上手使用。 ADF中關(guān)鍵的數(shù)據(jù)綁定概念如下: Data Control: Data Control是對(duì)業(yè)務(wù)接口的抽象,也就是說(shuō)所有訪問(wèn)業(yè)務(wù)對(duì)象的方法現(xiàn)在都通過(guò)Data Control來(lái)進(jìn)行,這樣使得綁定層使用一種方式來(lái)訪問(wèn)數(shù)據(jù),不論后臺(tái)的數(shù)據(jù)對(duì)象是種實(shí)現(xiàn)。可以把Data Control看做是一種代理機(jī)制。 Iterator Bindings and Control Bindings: Binding是一種輕量級(jí)的對(duì)象,它的主要目的就是讓后臺(tái)數(shù)據(jù)和前臺(tái)顯示解藕,這是老生常談的問(wèn)題,讓我們看看ADF是怎么做的。Iterator Binding 和提供集合對(duì)象數(shù)據(jù)的Data Control合作。 Control Bindings 則提供了一個(gè)標(biāo)準(zhǔn)的接口讓用戶界面可處理集合對(duì)象或者調(diào)用業(yè)務(wù)方法。 Binding Containers: Binding Container 對(duì)象記錄了某一個(gè)用戶界面使用了哪些iterator binding、control binding。 有一個(gè)XML文件記錄了這些內(nèi)容,在運(yùn)行時(shí)就會(huì)根據(jù)這個(gè)XML來(lái)生產(chǎn)一個(gè)Binding Container。 Binding Context: Binding Context 則是比Binding Container更大的一個(gè)概念,它包含了所有的Binding Container以及Data Control的信息。 下面介紹一個(gè)簡(jiǎn)單的應(yīng)用藍(lán)圖: 這個(gè)應(yīng)用是這樣的, 現(xiàn)在有一個(gè)論壇,在這個(gè)論壇上有一個(gè)頁(yè)面用來(lái)Review 一些Threads并指定一個(gè)team回復(fù)它,這個(gè)頁(yè)面叫做ReviewThreads.jsp 。 這個(gè)頁(yè)面需要從后臺(tái)的ForumService來(lái)獲得數(shù)據(jù)并指定回復(fù)的Team. ForumService是一個(gè)ADF的Application Module組件(Application module組件是對(duì)業(yè)務(wù)邏輯的一種抽象,它可以實(shí)現(xiàn)為java class,EJB,webservice等等,它也有自己的方法來(lái)調(diào)用View Object,這里大家只需要認(rèn)為它是一種業(yè)務(wù)組件就行了)。另外,這個(gè)頁(yè)面還需要一個(gè)所有可選Team的下拉框,這個(gè)下來(lái)框的數(shù)據(jù)來(lái)自一個(gè)web service LookupCodes。 對(duì)應(yīng)每一個(gè)業(yè)務(wù)組件會(huì)有一個(gè)Data Control包裝了該組件的業(yè)務(wù)方法。在該應(yīng)用的Binding Context中包含了兩個(gè)Binding Container, ReviewThreads和UnansweredPostings。前者提供給ReviewThreads.jsp使用,后者則同事支持uix頁(yè)面(uix是一種基于XML的界面語(yǔ)言),以及Jclient的一個(gè)Swing Panel。 ReviewThreads綁定容器包含了以下Binding: 1. 三個(gè)指向該應(yīng)用使用的數(shù)據(jù)集合的iterator binding。兩個(gè)由ForumService提供,一個(gè)由LookupCodes提供,如圖所示 2. 三個(gè)支持了界面上元素的Control Binding 首先是一個(gè)Attribute control binding 用來(lái)在頁(yè)面上Name輸入框中顯示Forum名字 其次是一個(gè)list binding來(lái)支持下拉框 最后是一個(gè)range binding用來(lái)支持JSTL的 顯示Team對(duì)象。 3. 一個(gè)control binding用來(lái)調(diào)用ForumService的一個(gè)方法,用來(lái)指定Team答復(fù)Thread. 需要注意的是,control value bindings 是需要通過(guò)iterator binding來(lái)獲得他們的數(shù)據(jù)。特別是list value binding它同時(shí)需要使用兩個(gè)iterator binding,一個(gè)用來(lái)取得所有的list中的值,另一個(gè)用來(lái)提供list中選擇的值。 下圖介紹了上述的組件在運(yùn)行時(shí)是怎么樣配合的。一個(gè)Binding Context包含了一個(gè)或者多個(gè)Data Control和Binding Container。每一個(gè)Binding Container會(huì)有一個(gè)或者多個(gè)iterator binding 指定了一個(gè)頁(yè)面使用的數(shù)據(jù)集合。每一個(gè)iterator binding從一個(gè)特定的Data control獲取及更改數(shù)據(jù)。Binding Container也會(huì)有一個(gè)或多個(gè)control binding 來(lái)支持頁(yè)面控制。當(dāng)Control binding需要和數(shù)據(jù)綁定時(shí),就要一個(gè)iterator binding相關(guān)聯(lián)。如果是一個(gè)control action binding,比如說(shuō)和頁(yè)面上的submit健關(guān)聯(lián)的binding則會(huì)要和一個(gè)data control 關(guān)聯(lián)用來(lái)調(diào)用service 層的方法。
Powered by: BlogJava Copyright © Kimi