我创建了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();
}
});
}
答案 0 :(得分:0)
根据Javadoc of ServletResponse#getWriter(),您可以使用response.getOutputStream()
或response.getWriter()
来编写响应正文,但不能同时使用两者。此外,最好在写入正文之前设置响应的状态代码。请尝试以下方法:
// ...
response.setStatus(HttpServletResponse.SC_OK);
OutputStream out = response.getOutputStream();
workbook.write(out);
out.flush();
out.close();
// response.getWriter().print("something");
// response.flushBuffer();
答案 1 :(得分:0)
您没有在创建FormPanel
的位置发帖,所以我不确定这是不是您的问题:
看起来FormPanel(String target)
构造函数不适用于SubmitCompleteHandler
。使用默认构造函数,它似乎可以工作。