In the era of Wide Web application, the C/S structure is not only based on the traditional database port connection method. If the network proxy and firewall are separated, Port Data is easily blocked. What we need is a network client application that can be accessed by Internet Explorer.
Here, my client uses Delphi
However, a problem arises here. When the data queried by Java is a list, how can we conveniently import the data to the table display on the Delphi client? Different people have different solutions. Some people use servlet to return XML for analysis. Some use servlet to generate a single string and then use split. Some use their own formatting analysis program and then fill in stringgrid.
I chose a simpler method: tkbmmemtable component + xfire. Xfire can easily transmit data by using HTTP, while tkbmmemtable can store data to tdataset for convenient use and access. If txquery is added. Wow .... The data processing and display functions become more powerful.
First, let's take a look at how convenient it is to pass a data table:
1. Define fields in the table to be queried in tkbmmemtable, and set active to true. The formatting component uses tkbmcsvstreamformat, which is set by default.
2. Use the list data queried by Dao in Java and use memtablerecbuilder (described later) to create CSV data that can be read by tkbmmemtable.
3. Pass resultarray to the client. Here I use my own set of universal WebService interfaces for data retrieval, which is not the focus of this Article. Therefore, ignore it. Because different people have different data transmission solutions.
4. Add the obtained data to the memory table through stringstream
Procedure tformrecordserver. bsskinbuttonsbarsections0items0click (
Sender: tobject );
VaR
Strstream: tstringstream;
Begin
Kbmmemtableprjinf. emptytable;
Strstream: = tstringstream. Create (datautil. findrecordingprjinf); // read data string
If strstream. size> 0 then
Kbmmemtableprjinf. loadfromstream (strstream); // this way, all data is transmitted to tkbmmemtable.
Strstream. Free;
End;
There is no redundant code. Except for xfire's own data transmission method, encoding and reading are just as simple as the above Code. Next, I will publish my own tkbmmemtable CSV data formatter:
Package com. aherp. Voice. util;
Public class memtablerecbuilder ...{
Private Static final string csv_qoute = """;
Private Static final char csv_record_delimiter = ',';
Private Static final string csv_true_string = "true ";
Private Static final string csv_false_string = "false ";
Private stringbuffer strbuf;
Private threadlocal <integer> fieldcount = new threadlocal <integer> ();
Public memtablerecbuilder ()...{
Strbuf = new stringbuffer ();
Fieldcount. Set (0 );
}
Public memtablerecbuilder buildfield (Object fielddata )...{
Int fieldcountint = fieldcount. Get ();
If (fieldcountint> 0)
Strbuf. append (csv_record_delimiter );
Fieldcount. Set (fieldcountint + 1 );
Strbuf. append (csv_qoute );
If (fielddata instanceof string )...{
Strbuf. append (
(String) fielddata). Replace (csv_qoute ,"""")
. Replace ("%", "% ")
. Replace ("", "% C ")
. Replace ("", "% N "));
}
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;
}
Public memtablerecbuilder newrow ()...{
Strbuf. append ('');
Fieldcount. Set (0 );
Return this;
}
Public String tostring ()...{
Return strbuf. tostring ();
}
}
Note that for bool data storage, kbmmemtable is determined by the two attributes of its formatter csvstreamformat csvfalsestring and csvtruestring.