【问题标题】:GWT FormPanel onSubmitComplete event not firing when downloading a file下载文件时未触发 GWT FormPanel onSubmitComplete 事件
【发布时间】: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 时才会被调用。

标签: events servlets gwt


【解决方案1】:

根据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();

【讨论】:

  • 还是不行。看起来“响应”在弄乱它的 OutputStream 时不喜欢。我尝试了 PrintWriter,但不幸的是结果相同
  • 您是否发现任何异常?也许最好使用你自己的OutputStream for workbook.write(out),然后通过out.write()将此输出流的内容写入响应中
  • 问题是,没有例外。一切正常,事件只是没有被触发。我可以尝试使用自己的 OutputStream,但恐怕它无济于事。如果简单地调用 response.getOutputStream() 或 response.getWriter() 而不写入它会导致问题,那么我认为肯定有其他问题。 Meby 有一个问题,我是用 FormPanel 做的。我可以使用其他东西,但不知道从哪里获取事件(成功请求事件)
  • 糟糕,我很抱歉我的误导性回答。我想,getWriter()getOutputStream() 的混淆一定是这个问题的原因。
  • 我用 FormPanel 和处理程序代码更新了我的问题。 Meby 问题出在某个地方。
【解决方案2】:

您没有发布创建 FormPanel 的行,所以我不确定这是否是您的问题:

看起来FormPanel(String target) 构造函数不适用于SubmitCompleteHandler。使用默认构造函数似乎可以工作。

【讨论】:

    猜你喜欢
    • 2012-10-16
    • 1970-01-01
    • 2011-08-22
    • 2013-11-23
    • 2011-12-05
    • 2010-12-04
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    相关资源
    最近更新 更多