【发布时间】:2014-08-30 04:51:17
【问题描述】:
我创建了 servlet 来从服务器下载文件。在 GWT 中,我创建了一个 FormPanel,我可以下载一个文件。
问题是,我想在文件准备好时触发一个事件。我尝试使用 onSubmitComplete 事件,但它没有触发。
我找到了一个建议,将 ContetType 更改为“text/html”,但仍然没有运气。我发现,问题在于写入 OutputStream - 注释掉时,会触发事件。
这是我的 servlet 代码
public void handleRequest(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setHeader("Content-Disposition", "attachment; filename=File.xls");
HSSFWorkbook workbook = new HSSFWorkbook();
try {
workbook = fileCreator.getWorkbook();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
OutputStream out = response.getOutputStream();
workbook.write(out);
out.close();
response.setStatus(HttpServletResponse.SC_OK);
response.getWriter().print("something");
response.flushBuffer();
}
所以文件下载成功,但没有触发事件。即使我只是获取 OutputStream 并关闭它(不写入它),事件也会停止工作。
当我删除整个“写入输出流”代码时,事件就像一个魅力。 有什么建议吗?
更新
这是 FormPanel 及其处理程序的代码,我有问题吗?
表格:
downloadFileFormPanel.setEncoding(FormPanel.ENCODING_URLENCODED);
downloadFileFormPanel.setMethod(FormPanel.METHOD_POST);
VerticalPanel panel = new VerticalPanel();
panel.setWidth(UIConstatns.SIZE_100percent);
downloadFileFormPanel.setWidget(panel);
downloadFileButton = new Button(messages.EXPORT_LIMITS());
downloadFileButton.setWidth(UIConstatns.SIZE_100percent);
downloadFileButton.addStyleName("navigation-button");
panel.add(downloadFileButton);
处理程序
private void registerExportLimitsHandler() {
registerHandler(getView().getDownloadFileButton().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
getView().showLoadingDialog();
getDownloadFileForm().submit();
}
}));
}
private void registerFormSubmitCompleteHandler() {
getView().getDownloadFileForm().addSubmitCompleteHandler(new SubmitCompleteHandler() {
public void onSubmitComplete(SubmitCompleteEvent event) {
Window.alert("download complete");
getView().hideLoadingDialog();
}
});
}
【问题讨论】:
-
onSubmitComplete 只有在响应类型为 text/html only 时才会被调用。