Aspire是一个RAD工具提供使用者以标准的XML/XSLJEE及关联式资料库技术快速地创建网站Aspire可接受的资料来源包含存储程序SQL语句EJBs及Java控件并使用Apache 的xerces/xalan作为转换的处理器
Aspire可使用于多种servlet引擎例如Apache/JServApache/Tomcat及WebSphere等
目前发展中的功能包含Crystal reports及Oracle reports等报表工具的整合界面 Aspire优点如下
一何为层次数据集?为什么要用层次数据集?
层次数据集并不是一个新的名词他们已经以客户信息控制系统的事务数据目录文件Java对象更接近于XML文件的格式存在了早在年的XML杂志上我就认为程序员可以从层次数据集的提取上得到好处尽管他们的数据源具有很强的数据相关性(像MySQL Oracle SQL Server DB等等之类的数据库)NET思想和数据集概念也很相似尽管我所认为的层次数据集和传统的微软的数据集有很大的不同层次数据集具有的丰富的细节描述极大增强了关系型数据的提取
本篇重在讲述层次数据集的结构和与其相关的Java API并不像XML杂志两年前所说的你现在就可以用一系列的可执行代码来获取层次数据集的优势当然我们可以在Java里编写一定代码来实现对各种各样的数据源的访问以及创建一个完整的层次数据集本篇中我们就将给出一可执行的代码你可以利用这些代码并结合一个简单的预定义的关系型适配器就可以创建一些层次数据集啦这里的关系型适配器包括文本阅读器SQL 脚本 存储过程等等
现在你可能会问了这个层次数据集究竟有什么好啊?当然层次数据集是不能和你的那些受到奖赏的同事得到的昂贵的Carbon带来的实惠相抗衡在编程中层次数据集是非常有用的对一个启动来说一个层次数据集就可以满足整个HTML页面上的所有的有价值的数据的需要在MVC(ModelViewControler)模型里控制器的servlet可以提交一个层次数据集给JSP页面后JSP页面就可以显示它而不需要任何的帮助也可以说通过控制器的servlet可直接将其转换为XML格式返回给请求者从实用的角度来说数据集可以转换成Excel格式的文件从新潮的角度来说层次数据集可以转换为支持XML数据的报表或者图表
本篇主要焦点是服务于Java程序员的Java编程的API怎么运用层次数据集实际上非Java程序员也可以通过有效地结合层次数据集和一个JEE的服务(比如Tomcat)从关系型数据库或者别的数据库中得到XMLHTML或者Excel格式文档不要过于急躁我们先来研究研究层次数据集的结构和这些数据集是如何被提取的(现在可以稍微放松一下啦^_^)
二 层次数据集的结构
层次数据集可以表示为一个JavaAPI XML或者别的格式而用XML来表示将会更加形象:
<AspireDataSet>
<! A set of key value pairs at the root level >
<key>val</key>
<key>val</key>
<! A set of named loops >
<loop name=loop>
</loop>
<loop name=loop>
</loop>
</AspireDataSet>
这是一系列的key/value对一个给定的key/value可以用在N个独立的loops当中其实每一个loop 就是一个数据表loop可以说是table的同义词了我没有用table这个术语是为了防止人们会不由自主的联想到关系型数据表已经说过了loop其实上是很多行记录的集合现在让我们在认真的看loop的结构:
<loop name=loopname>
<row>
<! a set of key value pairs >
<key>val</key>
<key>val</key>
<! a set of named loops >
<loop name=loopname>
</loop>
<! a set of named loops >
<loop name=loopname>
</loop>
</row>
<row>
</row>
</loop>
这里唯一一个不成对的结构就是row结构了一个row结构可以是一些key/value对的集合这里的row不仅包含了一些key/value对并且还包括了多个独立的loop结构的递归集这种扩展可以生成一定深度的树结构
三Java当中的层次数据的结构
当我把层次数据集以XML的形式展示的时候你可能会把层次数据集理解为字面上的XML因此你会先到DOM接着你甚至会想这样岂不是会占用很大的JVM内存不必慌张层次数据集有自己的的Java API二不需要DOM来描述下面就是一个层次数据集的Java API代码:
package lgen;
import comaidata*;
/**
* 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 lgen;
import comaidata*;
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 comaidata;
public interface IMetaData
{
public IIterator getIterator();
public int getColumnCount();
public int getIndex(final String attributeName)
throws FieldNameNotFoundException;
}
你是怎么得到层次数据集的?你又可以怎么去用他?
现在我们已经知道了层次数据集的结构了你又怎么去利用它呢?像我以前所说的这些再Aspire下是非常容易的具体的步骤如下:
学习Aspire的基础知识
为你的层次数据集创建定义文件
在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: section
###################################
requestihdsTestclassName=lgenDBHashTableFormHandler
requestihdsTestloopNames=works
#section
requestihdsTestworksclass_requestclassName=lgenGenericTableHandler
r