DELPHI與Java Web讀取TABLE資料最簡捷的方案:TkbmMemTable+java資料Format器

來源:互聯網
上載者:User
在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

 

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資料格式化器:

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

再提醒一點,對於bool型資料的儲存,kbmmemtable中是由其格式化器CSVStreamFormat的CSVFalseString和CSVTrueString的兩個屬性決定的

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.