代码之家  ›  专栏  ›  技术社区  ›  zytham

JSF中按钮点击的两个连续事件

  •  0
  • zytham  · 技术社区  · 13 年前

    我必须在点击按钮时执行两个操作。

    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>  
    
    3 回复  |  直到 13 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

    希望我没看错你。这对我很有效:

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

        2
  •  2
  •   AngelsandDemons    13 年前

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

    <h:commandLink target="new window">
    

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

    否则,您也可以使用iframe。它通常用于在同一页面上显示报表。。。

        3
  •  2
  •   Community Mohan Dere    9 年前

    据我所知,你的问题不是将操作结果重定向到新的选项卡,而是你想显示一个报告(如果我的猜测是正确的,你使用的是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>