使用 GWT 读取一个非常大的本地 XML 文件
Posted
技术标签:
【中文标题】使用 GWT 读取一个非常大的本地 XML 文件【英文标题】:Reading a very large local XML file using GWT 【发布时间】: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 或为此更改配置,或者文件是否是太大而无法读入字符串。任何帮助表示赞赏。谢谢。
【问题讨论】:
【参考方案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 和任何其他格式,唯一的选择是在服务器端发出请求以上是关于使用 GWT 读取一个非常大的本地 XML 文件的主要内容,如果未能解决你的问题,请参考以下文章