【问题标题】:Reading a very large local XML file using GWT使用 GWT 读取一个非常大的本地 XML 文件
【发布时间】:2011-10-28 01:41:19
【问题描述】:

我正在使用 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 并且 xmlData 从未分配给任何东西时,我得到了一个空指针异常。我尝试放置一个等待它存储“错误”或 XML 文本的 while 循环,但从未分配过该变量。我将XML文件保存在我项目的war目录中,似乎可以找到该文件。我在网上搜索了类似的示例,但一切似乎都比我尝试做的要复杂一些,而且我不确定是否需要 servlet 或为此更改配置,或者文件是否是太大而无法读入字符串。任何帮助表示赞赏。谢谢。

【问题讨论】:

    标签: java xml gwt nullpointerexception


    【解决方案1】:

    在客户端(在浏览器中)解析 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;
            }
        }
    ....
    

    【讨论】:

    • 感谢帮助方法!我会确保我尝试一下
    • 我试用了你的辅助方法,效果很好。我认为这意味着这些类型的服务器调用应该使用 AsyncCallback?再次感谢您的帮助,我真的很感激!
    • 不,使用AsyncCallback不是强制的,但是这个接口非常适合这样的使用。您当然可以设计方法来使用不同的方法,例如区分各种失败案例 - 但在我的应用程序中它没有意义
    • 好像我在火狐上编译运行的时候,得到的响应是0。网上看,好像是因为我在做跨站请求。我将如何避免这种情况?
    • 对于 json,有一个解决方法 - 请参阅 code.google.com/webtoolkit/doc/1.6/tutorial/Xsite.html 的“发出跨站点请求”;恐怕对于 xml 和任何其他格式,唯一的选择是在服务器端发出请求
    猜你喜欢
    • 2016-01-05
    • 2019-04-30
    • 2016-11-23
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多