【问题标题】:Two consecutive events on button click in JSFJSF中按钮单击的两个连续事件
【发布时间】:2012-08-17 13:44:15
【问题描述】:

我必须对按钮单击执行两个操作。

  1. 在 bean 中调用一个方法,该方法将返回一个 url,并将其设置在某个变量中。

  2. 之后,我必须在另一个选项卡中打开该网址。我正在使用 CommandButton 的 action 属性,它正确设置了 URL 值,但是如何在新选项卡中将该 url 作为 pdf 打开。即“pdf 的 URL 应在新选项卡中打开”

代码示例如下:

<div class="form-options">
    <h:commandButton value="Download Report" styleClass="btn btn-primary btn-icon buttonCustom" actionListener="#{reportBean.GenerateReport}">
    </h:commandButton>
</div>  

【问题讨论】:

    标签: jsf jstl


    【解决方案1】:

    使用 commandLink 代替 commandButton.. 使用 commandLink 时,您需要为目标属性提供值作为新窗口。

    <h:commandLink target="new window">
    

    其余所有代码都将根据您的要求。 由于您的报告所在的 URL 已经存在于其中一个变量中,您可以使用 commandLink 中 bean 中的此变量来提供 URL。

    另外你也可以使用iframe。它通常用于在同一页面上显示报告...

    【讨论】:

      【解决方案2】:

      希望我没听错。这对我有用:

      1. 在 commandButton 的 actionListener-attribute 中提供生成报告的方法和 URL(您已经做过,根据您的示例代码)。
      2. 在commandButton的action-attribute中提供返回URL的方法(在actionListener-method之后调用)。
      3. 要打开新标签页,请在父标签&lt;h:form&gt; 中添加target="_blank(取自this questions answer

      XHTML 代码:

      <h:form target="_blank">
          <h:commandButton value="Show Report" 
                           actionListener="#{reportBean.generateReport}"
                           action="#{reportBean.getUrl}" />
      </h:form>
      

      由于这种方法将 target="_blank" 应用于所有非 ajax 调用,因此这是使用 Javascript 的另一种方法:

      <h:form>
          <h:commandButton value="Show Report" 
                           actionListener="#{reportBean.generateReport}"
                           action="#{reportBean.getUrl}" 
                           onclick="this.form.target='_blank'"/>
      </h:form>
      

      Java-代码:

      public void generateReport(final ActionEvent evt) {
          // ... generating report and setting url-variable
      }
      
      
      public String getUrl() {
          return url;
      }
      

      如果您必须转发到外部链接,请参阅this question

      【讨论】:

      • 如果我必须将两个参数从 jsf 传递给 bean 那么它会工作吗?
      • 就像我必须调用带有两个参数的方法,例如 #{method_name(arg1,arg2)}
      • 似乎this 是适合您的方式。我建议您尝试方法 3(使用 f:attribute)。这应该对你有用,但由于我不知道你想传递什么样的参数以及它们来自哪里,我只能猜测。
      【解决方案3】:

      据我了解,您的问题不在于将操作结果重定向到新选项卡,而是您想要显示报告(如果我的猜测是正确的,您正在使用 JasperReport 并希望以 PDF 格式显示它格式)。为此,您必须将文件下载到客户端计算机,然后让客户端上的默认编辑器/程序处理该文件。

      文件下载的细节我就不多说了,BalusC 提供了很好的信息:

      在浏览器中显示 PDF(或任何其他)文件的相关部分是响应的 ContentType。这将告诉浏览器文件必须如何受到威胁。一些内容类型值

      • PDF:申请/pdf
      • Excel:应用程序/vnd.ms-excel
      • Microsoft Word:应用程序/ms-word
      • 更多:Internet media type

      如果我错了,并且您不想显示(下载)文件并需要在新窗口中打开文件,您有两种方法(恢复 @JanisK. 和 @AngelsandDemons 的答案):

      • 将表单的目标设置为“_blank”,但这样所有执行的操作将打开一个新的选项卡/窗口。

        <h:form target="_blank">
            <h:commandButton ... />
        </h:form>
        
      • 使用 commandLink 而不是 commandButton,您可以在其中仅为此链接请求设置目标。

        <h:form>
            <h:commandLink target="_blank" ... />
        </h:form>
        

      【讨论】:

      • Luiggi Mendoza Thumb Up :) 我正在使用 jasper 报告 .. 它现在可以工作了,谢谢。
      • 我用过这个:试试 { FacesContext.getCurrentInstance().getExternalContext().redirect(filenameonly); } catch (IOException ex) { // 在这里做点什么 }
      • @zytham 你为什么要用你的文件名重定向到你的路径?那是完全错误的。看来你还没有阅读我帖子中的链接。
      • 不,我只是让它像那样工作......但我正在尝试使用流方法的你的链接......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-07
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多