下载文件时GWT FormPanel onSubmitComplete事件未触发

时间:2014-07-09 08:41:06

标签: events servlets gwt

我创建了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();
        }
    });
}

2 个答案:

答案 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。使用默认构造函数,它似乎可以工作。