当前位置:天才代写 > tutorial > JAVA 教程 > Aspire和Tomcat利用条理数据集

Aspire和Tomcat利用条理数据集

2017-11-10 08:00 星期五 所属: JAVA 教程 浏览:309

副标题#e#

Aspire是一个RAD东西,提供利用者以尺度的XML/XSL、J2EE及关联式资料库技能快速地建设网站。Aspire可接管的资料来历包括存储措施、SQL语句、EJBs及Java控件,并利用Apache 的xerces/xalan作为转换的处理惩罚器。

Aspire可利用于多种servlet引擎,譬喻Apache/JServ、Apache/Tomcat及WebSphere等。

今朝成长中的成果包括Crystal reports及Oracle reports等报表东西的整合界面。Aspire利益如下:

1.低落开拓时间,开拓者只需专注在贸易逻辑及GUI的样子

2. 低落开拓技能门槛

3. 更佳的GUI界面

4.支援尺度的技能

5. 具有延展性及弹性

一.作甚条理数据集?为什么要用条理数据集?

条理数据集并不是一个新的名词。他们已经以客户信息节制系统的事务数据、目次文件、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布局的递归集.这种扩展可以生成必然深度的树布局.


#p#副标题#e#

三.Java傍边的条理数据的布局

当我把条理数据集以XML的形式展示的时候,你大概会把条理数据集领略为字面上的XML,因此你会先到DOM,接着你甚至会想这样岂不是会占用很大的JVM内存.不必张皇.条理数据集有本身的的Java API二不需要DOM来描写.下面就是一个条理数据集的Java API代码:

#p#分页标题#e#

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;
}

#p#副标题#e#

简朴的说来,上面的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
request.ihdsTest.works.loopNames=childloop1
request.ihdsTest.works.query_request.className=com.ai.data.RowFileReader
request.ihdsTest.works.query_request.filename=aspire:\\samples
\\pop-table-tags\\properties\\pop-table.data
#section3
request.childloop1.class_request.classname=com.ai.htmlgen.GenericTableHandler6
request.childloop1.query_request.classname=com.ai.data.RowFileReader
request.childloop1.query_request.filename=aspire:\\samples\\pop-table-tags
\\properties\\pop-table.data

#p#副标题#e#

这个界说包罗三个部门. 这个数据集的名字叫ihdsTest.第一部门汇报Aspire:Java类com.ai.htmlgen.DBHashTableFormHandler1认真返回一个工具实现ihds.假如你不本身编写你本身的ihds实现,在你界说每一个数据集的时候都必需用到这个类.这个预界说的类知道如何把干系型的数据构成以个条理型的数据集.第一部门的第二行汇报了DBHashTableFormHandler1含有一个轮回的主数据集是works.第二部门界说了轮回works.在Aspire里一个轮回布局用到了两个Java类:一个叫请求类(GenericTableHandler6) 另一个是查询请求类(RowFileReader). RowFileReader从一个一维文件傍边读取一系列的记录并把他们转换成一些行和列严格界说的荟萃. GenericTableHandler6按照这个荟萃团结挪用像汇总数值和行数之类的成果在轮回里事项接口ihds. GenericTableHandler6像DBHashtableFormHandler1一样在许多的界说傍边都将被挪用. RowFileReader将会按照你所利用的数据源的差异将会做稍微的调解.下面的例子里就列出了这些环境:

1. RowFileReader.

2. DBRequestExecutor2 (for reading SQL).

3. StoredProcedureExecutor2 (for reading from Stored Procedures).

4. XMLReader (for reading XML files).

5. Or, you can write your own reader that implements IDataCollection.

#p#分页标题#e#

第二部门说明它有一个子类childloop1. 在GenericTableHandler6里将会体现我们到第三部门去找这个子类childloop1.在第三部门界说了childloop1.这个界说是和第二部门里的一样的,除非它没有子类childloop1.第一和第二部门都用到了RowFileReaders.实际上它可以用于险些所有的数据读取部门.

此刻我们来挪用文件ihds-test.properties.下面是把这个文件包罗到Aspire的主文件aspire.properties的例子:

application.includeFiles=aspire:\\samples\\hello-world
\\properties\\hello-world.properties,\
aspire:\\samples\\ihds-test\\ihds-test.properties,\
aspire:\\samples\\xml-reader\\xml-reader.properties

为了完整性.我用了双斜线在处理惩罚傍边.

挪用你的界说并获得一个ihds.

此刻我们已经又了条理数据集的界说,我们如何从Java里挪用它呢?当真阅读第一篇文章对你将会有很大辅佐的,下面是相应的Java代码:

Hashtable args = new Hashtable();
args.put("key1".toLowerCase(), "value1");
IFactory factory = AppObjects.getFactory();
ihds hds = (ihds)factory.getObject("ihdsTest",args);
// use ihds

#p#副标题#e#

Aspire有一个IFactory接口描写的factory处事.你可以通过这个factory接口挪用Java类ihdsTest,并把所有的参数以哈希表的名目传入.小写的字符串对付一个干系型的适配器的下载流是很须要的.

开拓ihds API的措施源码:

下面的代码将遍历ihds树,并把它输出到屏幕:

import com.ai.htmlgen.*;
import com.ai.common.TransformException;
import Java.io.*;
import com.ai.data.*;
// above code removed for clarity
public static void staticTransform(ihds data, PrintWriter out)
throws TransformException
{
try
{
writeALoop("MainData",data,out,"");
}
catch(DataException x)
{
throw new TransformException(
"Error: DebugTextTransform: Data Exception",x);
}
}
/**********************************************************
* A recursive function to write out a loop worth of ihds
**********************************************************/
private static void writeALoop(
String loopname, ihds data, PrintWriter out, String is)
throws DataException
{
println(out,is, ">> Writing data for loop:" + loopname);
// write metadata
IMetaData m = data.getMetaData();
IIterator columns = m.getIterator();
StringBuffer colBuffer = new StringBuffer();
for(columns.moveToFirst();!columns.isAtTheEnd();columns.moveToNext())
{
String columnName = (String)columns.getCurrentElement();
colBuffer.append(columnName).append("|");
}
println(out,is,colBuffer.toString());
//write individual rows
for(data.moveToFirst();!data.isAtTheEnd();data.moveToNext())
{
StringBuffer rowBuffer = new StringBuffer(); for(columns.moveToFirst();!columns.isAtTheEnd();columns.moveToNext())
{
String columnName = (String)columns.getCurrentElement();
rowBuffer.append(data.getvalue(columnName));
rowBuffer.append("|");
}
println(out,is,rowBuffer.toString());
// recursive call to print children
IIterator children = data.getChildNames(); for(children.moveToFirst();!children.isAtTheEnd();children.moveToNext())
{
// for each child
String childName = (String)children.getCurrentElement();
ihds child = data.getChild(childName);
writeALoop(childName,child,out,is + "\t");
}
}
println(out,is,">> Writing data for loop:" + loopname + " is complete");
}
private static void println(PrintWriter out, String indentationString,
String line)
{
out.print(indentationString);
out.print(line);
out.print("\n");
}
// code removed for clarity

#p#副标题#e#

如安在Tomcat下用ihds

#p#分页标题#e#

通过Java代码会见条理数据集的便利性已经显现,包罗呼吁行应用措施.一旦Aspire在Tomcat下被初始化,进一步说你就可以直接在你的网页上包罗数据集啦.今朝支持的名目有:尺度的XML,XML工具,文本文件以及Excel数据.未来的名目打算包罗Java类的界说将会何xml,XSD工具以及一般的HTML页面相匹配.在你想获得这些名目标网页之前,你必需要把握如安在Tomcat下初始化Aspire.上面的评论摘自“Improve Your Career with Tomcat and Aspire.”

假如你已经熟悉了上面的内容,那我们此刻就进入下面的话题:

1. 在设置文件里把你的条理数据集的界说联接到一个URL.

2. 通过一个指定的范例的数据名目挪用这个URL.

把下面的部门加到你已经界说的设置文件里:

###################################
# ihdsTestURL: linking to a URL
###################################
ihdsTestURL=aspire:\\samples\\ihds-test\\ihds-default-html-template.html
ihdsTestURL.formHandlerName=ihdsTest
request.ihdsTest.form_handler.class_request.className=
com.ai.htmlgen.DBHashTableFormHandler1

在Aspire里有两部门和URL的界说有关:数据源和数据转换.Aspire可以操作JSP,XSLT,可能标签来举办数据的转换.默认的转换—标签—需要一个包罗标签的模板文件名.第一行包罗界说了数据的转换文件第二行指定一个数据界说来挪用用于下载这一行的类ihdsTest.第三行本质上是和第一部门的第一行一样的浸染.这种差别担保了Aspire的向后兼容性.

确保认真转换的Java类在属性文件里有明晰的描写:

Aspire有两种转换的方法,就是普通转换和非凡转换.上面是一个非凡转换的例子,因为描写的HTML模板是这个页面专用的.普通的转换方法能把任何的条理数据集转换维任何的页面.下面是一个普通转换方法的设置文件样式:

# Generic transform support
# XML output
GenericTransform.Classic-xml.classname=
com.ai.xml.FormHandlerToXMLTransform
GenericTransform.Object-xml.classname=
com.ai.generictransforms.ObjectXMLGenericTransform
# Excel output
GenericTransform.Excel.classname=
com.ai.generictransforms.ExcelGenericTransform
# Text
GenericTransform.Text.classname=
com.ai.generictransforms.DebugTextTransform

这些界说常常被包罗到aspire.properties主文件里.

Invoke the URL with a Proper Output Format Parameter

通过适当的输格外式参数挪用一个URL:

一旦URL被界说.你就可以通过下面的路径看到功效的HTML页面了:

http://yourhost:yourport/your-webapp/servlet/DisplayServlet?url=ihdsTestURL

这将发生一个HTML页面.假如我们想通过挪用一个URL来获得一个尺度的XML名目标数据,我们只需要把下面的语句添加到上面的URL傍边:

&aspire_output_format=classic-xml

#p#副标题#e#

对付Excel文件,名目如下:

&aspire_output_format=Excel

主要就是将aspire_output_format参数和普通的Java类名接洽起来.写这些普通的转换来满意你的输出长短常简朴的.下面是一个实现Excel的普通转换的代码:

建设你本身的输格外式可能实现你本身的普通数据转换

package com.ai.generictransforms;
import com.ai.htmlgen.*;
import com.ai.common.TransformException;
import Java.io.*;
import com.ai.data.*;
import Javax.servlet.http.*;
public class ExcelGenericTransform
extends AHttpGenericTransform
implements IFormHandlerTransform
{
private static String s_separator = "\t";
protected String getDerivedHeaders(HttpServletRequest request)
{
return "Content-Type=application/vnd.ms-excel|Content-Disposition=
filename=aspire-hierarchical-dataset.xls";
}
public void transform(ihds data, PrintWriter out)
throws TransformException
{
staticTransform(data,out);
}
public void transform(IFormHandler data, PrintWriter out)
throws TransformException
{
staticTransform((ihds)data,out);
}
public static void staticTransform(ihds data, PrintWriter out)
throws TransformException
{
try
{
writeALoop("MainData",data,out,"");
}
catch(DataException x)
{
throw new TransformException("Error: ExcelGenericTransform:
Data Exception",x);
}
}
private static void writeALoop(String loopname,
ihds data,
PrintWriter out,
String is)
throws DataException
{
println(out,is, ">> Writing data for loop:" + loopname);
// write metadata
IMetaData m = data.getMetaData();
IIterator columns = m.getIterator();
StringBuffer colBuffer = new StringBuffer();
for(columns.moveToFirst();!columns.isAtTheEnd();columns.moveToNext())
{
String columnName = (String)columns.getCurrentElement();
colBuffer.append(columnName).append(s_separator);
}
println(out,is,colBuffer.toString());
//write individual rows
for(data.moveToFirst();!data.isAtTheEnd();data.moveToNext())
{
StringBuffer rowBuffer = new StringBuffer();
for(columns.moveToFirst();!columns.isAtTheEnd();columns.moveToNext())
{
String columnName = (String)columns.getCurrentElement();
rowBuffer.append(data.getvalue(columnName));
rowBuffer.append(s_separator);
}
println(out,is,rowBuffer.toString());
// recursive call to print children
IIterator children = data.getChildNames();
for(children.moveToFirst();!children.isAtTheEnd();children.moveToNext())
{
//for each child
String childName = (String)children.getCurrentElement();
ihds child = data.getChild(childName);
writeALoop(childName,child,out,is + "\t");
}
}
println(out,is,">> Writing data for loop:" + loopname + " is complete");
}
private static void println(PrintWriter out, String
indentationString, String line)
{
out.print(indentationString);
out.print(line);
out.print("\n");
}
}

条理数据集和Tomcat开拓团队下的Aspire之间的接洽

#p#分页标题#e#

Tomcat开拓团队对这些东西之间的关联长短常感乐趣的.网页开拓者可以把一系列的数据标识放在页面的头部,并答允用户输入本身首选的名目标数据,然后网页开拓者就可以通过这种机制来获取数据.对付要用到电子数据表的终端用户来说,一个可以支持Excel输出的机制长短常受接待的.B2B的用户可以获得XML名目标数据.Java和此外开拓人员可以把这些数据绑定起来,并以Java类的名目获得他,然后就可以通过这个Java类像对XML操纵那样操纵这些数据绑定.

所有提到的东西对付Tomcat开拓人员都是一个免费的很小的包.这就意味着,对付所有的学生和各类条理的开拓者来说,他们可以免费下载一整套的Tomcat和Aspire以便和像Dreamweaver之类的东西共同利用,并在任何他们所选择的数据库运用傍边城市发生很好的结果.

跟着进修履历的不绝积聚, 在这种布局的基本上,他们可以开始写一些plug-ins,甚至一些精悍的Java开拓人员可以举办一些专用的开拓.这种布局是一个通往进修Java,J2EE,XML和企业开拓的很好的梯子.

 

    关键字:

天才代写-代写联系方式