2011-08-16 12 views
3

私は非常に大きなXMLファイルからデータを読み込まなければならないGWTを使って最初のJavaアプリケーションを構築しています。ファイル内の情報の要求を送信しようとするときに問題が発生しています。ファイルのサイズやセマンティクスと関係があるかどうかはわかりません。私のプログラムでは、私は次のようしている: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を表示しようとするとnullpointer例外が発生し、xmlDataは決して割り当てられないということです。私はそれが "エラー"またはXMLテキストを格納するのを待っていたwhileループを置こうとしましたが、変数は決して割り当てられませんでした。私はXMLファイルを自分のプロジェクトのwarディレクトリに保存してあり、そのファイルを見つけることができるようです。私は同様の例をオンラインで検索しましたが、すべてが私がやろうとしているものよりも少し複雑に思えましたが、私はサーブレットや設定の変更が必要かどうかわかりません。 Stringを読み込むには大きすぎます。どんな助けもありがとうございます。ありがとう。

答えて

2

クライアント側(ブラウザ内)でxmlを解析するのは非常に遅く、避けるべきです。これをサーバー側に委譲する方が通常より速く、よりユーザーフレンドリーです(大きなファイルは、ブラウザーが長時間応答しなくなる原因になります)。

決定はあなた次第ですが;)ここでは、私はファイルを読み取るために使用するものである:

は、このヘルパーメソッド定義:あなたのコードで

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の使用は必須ではありませんが、このインターフェイスはこのような使用に非常に適しています。もちろん、さまざまな失敗のケースを区別するために、異なるものを使用する方法を設計することはできますが、私のアプリケーションでは意味がありませんでした。 –

関連する問題