2011-08-16 54 views
3

我正在使用GWT構建我的第一個Java應用程序,它必須從非常大的XML文件讀取數據。當我嘗試發送文件中信息的請求時,我遇到了問題,而且我不太確定它是否與文件的大小或我的語義有關。在我的計劃,我有以下:使用GWT讀取非常大的本地XML文件

static final String xmlurl = "filename.xml"; 
String xmlData; 

... 

public void onModuleLoad() { 
requestData(xmlurl); 
if(xmlData.equals("Error")){ 
    // display error message 
    return; 
} else { 
    // display the xml 
} 

void requestData(String url){ 
    final int STATUS_CODE = 200; 

    RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, url); 
    try { 
     builder.setTimeoutMillis(2000); 
     builder.sendRequest(null, new RequestCallback() { 
       public void onError(Request request, Throwable exception) { 
        xmlData = "Error" 
       } 

       public void onResponseReceived(Request request, Response response) { 
        if (STATUS_CODE == response.getStatusCode()){ 
         xmlData = response.getText(); 
        } else { 
         xmlData = "Error"; 
        } 
       } 
     } 
    } catch (RequestException e) { 
     xmlData = "Error"; 
    } 
} 

我重寫了代碼,所以我可能已經取得了一些錯別字,但在實際應用中它編譯和運行。問題是當我嘗試顯示XML並且xmlData從不分配給任何東西時,我得到一個空指針異常。我試着放置一個while循環,等待它存儲「錯誤」或XML文本,但該變量從未分配給。我將XML文件保存在我的項目的war目錄中,似乎能夠找到該文件。我在網上搜索了類似的例子,但是一切似乎都比我想要做的更復雜一些,而且我不確定是否需要servlet或配置更改,或者文件是隻是太大而無法讀入字符串。任何幫助表示讚賞。謝謝。

回答

2

在客戶端解析xml(在瀏覽器中)很慢,應該避免;委託給服務器端的速度通常更快,因此用戶更友好(大文件會導致瀏覽器停止響應很長時間)。

但是決定權在你;)以下是我使用的讀取文件:

定義這個helper方法:

public static void httpGetFile(final String url, final AsyncCallback<String> callback) { 
    final RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, url); 
    rb.setCallback(new RequestCallback() { 
     public void onResponseReceived(Request request, Response response) { 
      try { 
       final int responseCode = response.getStatusCode()/100; 
       if (url.startsWith("file:/") || (responseCode == 2)) { 
        callback.onSuccess(response.getText()); 
       } else { 
        callback.onFailure(new IllegalStateException("HttpError#" + response.getStatusCode() + " - " + response.getStatusText())); 
       } 
      } catch (Throwable e) { 
       callback.onFailure(e); 
      } 
     } 

     public void onError(Request request, Throwable exception) { 
      callback.onFailure(exception); 
     } 
    }); 
    try { 
     rb.send(); 
    } catch (RequestException e) { 
     callback.onFailure(e); 
    } 
} 

在你的代碼,它可能是這樣的:

... 
    httpGetFile(url, new AsyncCallback<String>() { 
     public void onFailure(Throwable caught) { 
      xmlData = "Error"; 
     } 

     public void onSuccess(String xmlText) { 
      xmlData = xmlText; 
     } 
    } 
.... 
+0

感謝您的幫手方法!我會確保我嘗試一下 – Ahmed

+0

我嘗試了你的幫助器方法,它完美地工作。我認爲這意味着這些類型的服務器調用應該使用AsyncCallback?再次感謝您的幫助,我真的很感激! – Ahmed

+0

不行,使用AsyncCallback不是強制性的,但是這個接口非常適合這樣的使用。你當然可以設計使用不同的方法,例如區分各種故障情況 - 但在我的應用程序中它沒有意義 –