在WEB广泛应用的时代,C/S结构不单是基于传统的数据库端口连接的方式。因为如果中间隔了网络代理、防火墙,端口数据则很容易被拦截。我们需要的是能开IE就能访问的网络客户端应用。
在此,我的客户端采用的是DELPHI
然而一个问题在此就产生了。当java查询出的数据是一个 List列表时,如何方便的导入到DELPHI客户端的表格显示呢?不同人有不同的解决方法,有人采用Servlet返回XML来分析,有的用Servlet产生单个string传递然后去split,有人去采用自己的格式化分析程序然后填写到StringGrid。
而我则选择了一种更简便的方式:TkbmMemTable组件+XFIRE。XFIRE发送数据能方便的利用HTTP来传输,而TkbmMemTable将数据存到TDataSet则能方便的使用和访问,如果再加上TxQuery。哇。。。。那数据处理和显示功能就更加强大了。
先看看传递一个数据表是如何的方便:
1.在TkbmMemTable定义要查询出来表的各字段,再设置Active=true。格式化组件采用TkbmCSVStreamFormat,默认设置即可。
2.使用JAVA的DAO查询的List数据,使用MemTableRecBuilder(稍后介绍)建立成TkbmMemTable能读取的CSV
package
com.aherp.voice.util;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
public
class
MemTableRecBuilder
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
private static final String CSV_QOUTE = """;
private static final char CSV_RECORD_DELIMITER = ',';
private static final String CSV_TRUE_STRING = "True";
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
private static final String CSV_FALSE_STRING = "False";
private StringBuffer strbuf;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
private ThreadLocal<Integer> fieldCount = new ThreadLocal<Integer>();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public MemTableRecBuilder()...{
strbuf = new StringBuffer();
fieldCount.set(0);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public MemTableRecBuilder buildField(Object fieldData)...{
int fieldCountInt = fieldCount.get();
if(fieldCountInt > 0)
strbuf.append(CSV_RECORD_DELIMITER);
fieldCount.set(fieldCountInt + 1);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
strbuf.append(CSV_QOUTE);
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(fieldData instanceof String)...{
strbuf.append(
((String)fieldData).replace(CSV_QOUTE, """")
.replace("%", "%%")
.replace(" ", "%c")
.replace(" ", "%n"));
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
else if(fieldData instanceof Boolean)...{
if((Boolean)fieldData)
strbuf.append(CSV_TRUE_STRING);
else
strbuf.append(CSV_FALSE_STRING);
}
else
strbuf.append(fieldData);
strbuf.append(CSV_QOUTE);
return this;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public MemTableRecBuilder newRow()...{
strbuf.append(' ');
fieldCount.set(0);
return this;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public String toString()...{
return strbuf.toString();
}
}
再提醒一点,对于bool型数据的存储,kbmmemtable中是由其格式化器CSVStreamFormat的CSVFalseString和CSVTrueString的两个属性决定的
在此,我的客户端采用的是DELPHI
然而一个问题在此就产生了。当java查询出的数据是一个 List列表时,如何方便的导入到DELPHI客户端的表格显示呢?不同人有不同的解决方法,有人采用Servlet返回XML来分析,有的用Servlet产生单个string传递然后去split,有人去采用自己的格式化分析程序然后填写到StringGrid。
而我则选择了一种更简便的方式:TkbmMemTable组件+XFIRE。XFIRE发送数据能方便的利用HTTP来传输,而TkbmMemTable将数据存到TDataSet则能方便的使用和访问,如果再加上TxQuery。哇。。。。那数据处理和显示功能就更加强大了。
先看看传递一个数据表是如何的方便:
1.在TkbmMemTable定义要查询出来表的各字段,再设置Active=true。格式化组件采用TkbmCSVStreamFormat,默认设置即可。
2.使用JAVA的DAO查询的List数据,使用MemTableRecBuilder(稍后介绍)建立成TkbmMemTable能读取的CSV
3.将resultArray传递给客户端,在此我使用了自己的一套获取数据的通用WebService接口,不是本文的重点,因此忽略。因为不同人也有各自不同的数据传递方案。
4.将获取的数据通过StringStream放入内存表
procedure TFormRecordServer.bsSkinButtonsBarSections0Items0Click(
Sender: TObject);
var
strStream: TStringStream;
begin
kbmMemTablePrjInf.EmptyTable;
strStream := TStringStream.Create(DataUtil.findRecordingPrjInf); //读取的数据string
if strStream.Size > 0 then
kbmMemTablePrjInf.LoadFromStream(strStream); //这样就把数据全部传递到了TkbmMemTable
strStream.Free;
end;
没有多余的代码,除了XFIRE传递数据的采用自己的方式外,编码和读取就上面这么简单的代码。接下来公布我自己编写的TkbmMemTable CSV数据格式化器:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
再提醒一点,对于bool型数据的存储,kbmmemtable中是由其格式化器CSVStreamFormat的CSVFalseString和CSVTrueString的两个属性决定的