Aspire是一個RAD工具,提供使用者以標準的XML/XSL、J2EE及關聯式資料庫技術快速地創建網站。Aspire可接受的資料來源包含存儲程序、SQL語句、EJBs及Java控件,并使用Apache 的xerces/xalan作為轉換的處理器。
Aspire可使用于多種servlet引擎,例如Apache/JServ、Apache/Tomcat及WebSphere等。
目前發展中的功能包含Crystal reports及Oracle reports等報表工具的整合界面。 Aspire優點如下:
一.何為層次數據集?為什么要用層次數據集?
層次數據集并不是一個新的名詞。他們已經以客戶信息控制系統的事務數據、目錄文件、Java對象、更接近于XML文件的格式存在了。早在2001年的XML雜志上,我就認為程序員可以從層次數據集的提取上得到好處,盡管他們的數據源具有很強的數據相關性(像:MySQL, Oracle, SQL Server, DB2等等之類的數據庫)。.NET思想和數據集概念也很相似。盡管我所認為的層次數據集和傳統的微軟的數據集有很大的不同,層次數據集具有的豐富的細節描述極大增強了關系型數據的提取。
本篇重在講述層次數據集的結構和與其相關的Java API。并不像XML雜志兩年前所說的,你現在就可以用一系列的可執行代碼來獲取層次數據集的優勢。當然我們可以在Java里編寫一定代碼來實現對各種各樣的數據源的訪問以及創建一個完整的層次數據集,本篇中我們就將給出一可執行的代碼,你可以利用這些代碼并結合一個簡單的預定義的關系型適配器就可以創建一些層次數據集啦。這里的關系型適配器包括:文本閱讀器,SQL 腳本, 存儲過程等等。
現在你可能會問了:“這個層次數據集究竟有什么好???”。當然層次數據集是不能和你的那些受到獎賞的同事得到的昂貴的Carbon帶來的實惠相抗衡,在編程中層次數據集是非常有用的。對一個啟動來說,一個層次數據集就可以滿足整個HTML頁面上的所有的有價值的數據的需要。在MVC(Model-View-Controler)模型里,控制器的servlet可以提交一個層次數據集給JSP頁面后,JSP頁面就可以顯示它而不需要任何的幫助。也可以說,通過控制器的servlet可直接將其轉換為XML格式返回給請求者。從實用的角度來說,數據集可以轉換成Excel格式的文件。從新潮的角度來說,層次數據集可以轉換為支持XML數據的報表或者圖表。
本篇主要焦點是服務于Java程序員的Java編程的API怎么運用層次數據集,實際上非Java程序員也可以通過有效地結合層次數據集和一個J2EE的服務(比如Tomcat)從關系型數據庫或者別的數據庫中得到XML、HTML、或者Excel格式文檔。不要過于急躁,我們先來研究研究層次數據集的結構和這些數據集是如何被提取的(現在可以稍微放松一下啦^_^)。
二. 層次數據集的結構
層次數據集可以表示為一個JavaAPI ,XML或者別的格式,而用XML來表示將會更加形象:
<AspireDataSet>
<!-- A set of key value pairs at the root level -->
<key1>val1</key1>
<key2>val2</key2>
<!-- A set of named loops -->
<loop name="loop">
</loop>
<loop name="loop2">
</loop>
</AspireDataSet>
這是一系列的key/value對.一個給定的key/value可以用在N個獨立的loops當中.其實每一個loop 就是一個數據表.loop可以說是table的同義詞了.我沒有用table這個術語是為了防止人們會不由自主的聯想到關系型數據表.已經說過了loop其實上是很多行記錄的集合,現在讓我們在認真的看loop的結構:
<loop name="loopname">
<row>
<!-- a set of key value pairs -->
<key1>val1</key1>
<key2>val2</key2>
<!-- a set of named loops -->
<loop name="loopname1">
</loop>
<!-- a set of named loops -->
<loop name="loopname2">
</loop>
</row>
<row>
</row>
</loop>
這里唯一一個不成對的結構就是row結構了.一個row結構可以是一些key/value對的集合.這里的row不僅包含了一些key/value對,并且還包括了多個獨立的loop結構的遞歸集.這種擴展可以生成一定深度的樹結構.
三.Java當中的層次數據的結構
當我把層次數據集以XML的形式展示的時候,你可能會把層次數據集理解為字面上的XML,因此你會先到DOM,接著你甚至會想這樣豈不是會占用很大的JVM內存.不必慌張.層次數據集有自己的的Java API二不需要DOM來描述.下面就是一個層次數據集的Java API代碼:
package com.ai.htmlgen;
import com.ai.data.*;
/**
* Represents a Hierarchical Data Set.
* An hds is a collection of rows.
* You can step through the rows using ILoopForwardIterator
* You can find out about the columns via IMetaData.
* An hds is also a collection loops originated using the current row.
*/
public interface ihds extends ILoopForwardIterator
{
/**
* Returns the parent if available
* Returns null if there is no parent
*/
public ihds getParent() throws DataException;
/**
* For the current row return a set of
* child loop names. ILoopForwardIteraor determines
* what the current row is. *
* @see ILoopForwardIterator
*/
public IIterator getChildNames() throws DataException;
/**
* Given a child name return the child Java object
* represented by ihds again
*/
public ihds getChild(String childName) throws DataException;
/**
* returns a column that is similar to SUM, AVG etc of a
* set of rows that are children to this row.
*/
public String getAggregatevalue(String keyname) throws DataException;
/**
* Returns the column names of this loop or table.
* @see IMetaData
*/
public IMetaData getMetaData() throws DataException;
/**
* Releases any resources that may be held by this loop of data
* or table.
*/
public void close() throws DataException;
}
簡單的說來,上面的ihds接口就是一個層次數據集的接口.這個API使你可以遞歸的訪問你的loop結構.這個接口里有一些遍歷loop結構是需要的一些選項.它也能假定是前序遍歷或者隨機遍歷.現在我來介紹的是這個API用到的兩個附加的接口: ILoopForwardIterator和IMetaData:
如何在IHDS里遍歷行記錄的接口: ILoopForwardIterator
package com.ai.htmlgen;
import com.ai.data.*;
public interface ILoopForwardIterator
{
/**
* getvalue from the current row matching the key
*/
public String getvalue(final String key);
public void moveToFirst() throws DataException;
public void moveToNext() throws DataException;
public boolean isAtTheEnd() throws DataException;
}
IMetaData: 用于讀取列名的接口
package com.ai.data;
public interface IMetaData
{
public IIterator getIterator();
public int getColumnCount();
public int getIndex(final String attributeName)
throws FieldNameNotFoundException;
}
你是怎么得到層次數據集的?你又可以怎么去用他?
現在我們已經知道了層次數據集的結構了,你又怎么去利用它呢?像我以前所說的,這些再Aspire下是非常容易的.具體的步驟如下:
1. 學習Aspire的基礎知識
2. 為你的層次數據集創建定義文件
3. 在Java 代碼里調用你的定義和ihds接口
下面具體介紹了這里面的細節:
閱讀Aspire JAR的基礎的使用方法:
Aspire是一個很小的jar文件,當你用像Tomcat這樣的app服務器的時候,它是你的Java程序的一個補充.再Aspire的核心是一系列的配置文件,在這些文件里你可以聲明你的根據Java類的數據訪問機制和這些Java類的評論.Aspire將執行這些Java類并返回期待的結果對象.層次數據集是沒有異常的.
一個早期的標志性的對Aspire的評論參見:“ For Tomcat Developers, Aspire Comes in a JAR”.配置了初始化一個Aspire就像你定義數據庫.調用SQL語句或者存儲過程一樣.
為你的層次數據集創建定義文件:
一個層次數據集的定義實例:
###################################
# ihdsTest data definition: section1
###################################
request.ihdsTest.className=com.ai.htmlgen.DBHashTableFormHandler1
request.ihdsTest.loopNames=works
#section2
request.ihdsTest.works.class_request.className=com.ai.htmlgen.GenericTableHandler6
r
原文轉自:http://www.anti-gravitydesign.com