1

背景

使用 JDeveloper 11.1.2.3 创建报告下载按钮,使用fileDownloadActionListener如下:

<af:commandButton text="Run Report" id="submitReport">
  <af:fileDownloadActionListener method="#{reportBean.run}"/>
</af:commandButton>

此 JSF 页面的顶部是以下内容:

<f:view afterPhase="#{validationBean.afterPhase}" ...>
  ...
    <af:form id="f1">
      <f:event listener="#{validationBean.postValidate}" type="postValidate"/>

这个想法是验证 Bean 可以捕获任何验证问题,如下所示:

public void afterPhase(javax.faces.event.PhaseEvent phaseEvent) {
  if (phaseEvent.getPhaseId() == PhaseId.RENDER_RESPONSE) {
    FacesContext context = phaseEvent.getFacesContext();
    FacesMessage.Severity severity = context.getMaximumSeverity();

    if (isSevereError(severity)) {
      context.getExternalContext().getSessionMap().put(ERROR_FLAG_NAME, true);
    }
  }
}

这按预期工作。当用户按下按钮,但表单出现错误时,validationError会话变量设置为true. 如果表单参数有错误,这应该允许框架防止生成报告。

问题

报告 bean的validationErrorrun 方法使用 session 变量,如下所示:

  public void run(FacesContext facesContext, OutputStream outputStream) {
    Object error = facesContext.getExternalContext().getSessionMap().get( ERROR_FLAG_NAME );

    if( error != null && error != Boolean.TRUE ) {
      Report report = null;

      try {
        report = getReport();
        report.setOutputStream(outputStream);
        configure(report.getParameters());
        report.run();
      } catch (Exception e) {
        if (report != null && facesContext != null) {
          report.publish(e);
        }
      }
    }
    else {
      facesContext.getExternalContext().getSessionMap().remove( ERROR_FLAG_NAME );
      facesContext.renderResponse();
    }
  }

当页面出现验证错误时,facesContext.renderResponse();代码被执行,但生成的网页是空白的。不记录任何异常。不会产生错误。

问题

避免这种情况的一种方法是使用隐藏按钮、自定义 Java 和一些 JavaScript,如下页所述:

然而,这种机制是复杂的。如果页面可以照常呈现,我想到的解决方案将起作用。

af:fileDownloadActionListener事件触发后如何强制呈现页面?

4

1 回答 1

1

弗兰克·尼菲乌斯

使用隐藏按钮是您今天唯一可用的选项。我将提交一个 ER,它会为 fileDownload 侦听器(某种预下载)引发一个事件,该事件应该允许您通过调用 Render Response 来取消它。如前所述,这还不存在,隐藏按钮是您可用的选项(请注意,文件下载标签是客户端行为标签,而不是完整的 UI 组件,这就是为什么还没有办法中断执行的原因。

于 2013-02-01T17:00:47.420 回答