0

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

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

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

代码示例如下:

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

3 回答 3

2

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

<h:commandLink target="new window">

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

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

于 2012-08-22T08:29:55.647 回答
2

希望我理解你的正确。这对我有用:

  1. 在 commandButton 的 actionListener-attribute 中提供生成报告的方法和 URL(根据您的示例代码,您已经做了什么)。
  2. 在 commandButton 的 action-attribute 中提供返回 URL 的方法(它将在 actionListener-method 之后调用)。
  3. 要打开新选项卡,请添加target="_blank父级<h:form>(取自此问题答案

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;
}

如果您必须转发到外部链接,请参阅此问题

于 2012-08-22T08:29:59.420 回答
2

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

关于文件下载我不会详述,BalusC 提供了关于这个问题的很好的信息:

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

  • PDF:申请/pdf
  • Excel:应用程序/vnd.ms-excel
  • Microsoft Word:应用程序/ms-word
  • 更多:网络媒体类型

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

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

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

    <h:form>
        <h:commandLink target="_blank" ... />
    </h:form>
    
于 2012-08-22T15:39:29.387 回答