使用GWT读取非常大的本地XML文件

时间:2011-08-16 13:14:21

标签: java xml gwt nullpointerexception

我正在使用GWT构建我的第一个Java应用程序,它必须从非常大的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从未分配给任何东西。我尝试使用while循环等待它存储“错误”或XML文本,但变量从未分配给。我将XML文件保存在项目的war目录中,似乎能够找到该文件。我在网上搜索了类似的例子,但是一切似乎都比我想做的要复杂得多,而且我不确定我是否需要一个servlet或配置更改,或者如果文件是太大了,无法读入字符串。任何帮助表示赞赏。感谢。

1 个答案:

答案 0 :(得分: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;
        }
    }
....