【问题标题】:Invoke action in f:viewAction while navigating using p:commandButton在使用 p:commandButton 导航时调用 f:viewAction 中的操作
【发布时间】:2016-06-17 20:56:28
【问题描述】:

home.xhtml

<p:button outcome="product" value="Login Simple Button"/>
<p:commandButton value="Login" action="#{homeController.validate}" update="logindialog"/>

product.xhtml

<f:metadata> <f:viewAction action="#{productController.readProductGroup}" /> </f:metadata>

简单的 p:button 导航并成功调用 readProductGroup();但是即使 homeController.validate() 方法返回“product”并成功导航到 product.xhtml,p:commandButton 也不会。

使用 p:button,我无法灵活地调用服务器方法、使用更新属性等。

我需要的是,能够在 home.xhtml 页面按钮中使用更新、action/actionListener 等属性,同时在导航到 product.xhtml 时,应该能够调用函数 productController.readProductGroup在页面加载时在 f:metadata 下。

请提出建议。

【问题讨论】:

  • 没有得到任何错误,只是没有调用我想要调用的方法。根据以下建议使用 product?faces-redirect=true 并使其工作。

标签: jsf primefaces postback viewaction


【解决方案1】:

&lt;f:viewAction&gt; 设计为在 GET 请求上运行,而不是在 POST 请求上运行。要对 POST 请求调用操作,您应该使用 &lt;h:commandXxx&gt;

如果您出于某种原因也确实想在 POST 请求上运行 &lt;f:viewAction&gt;,那么只需将其 onPostback 属性设置为 true

<f:viewAction ... onPostback="true" />

另一方面,你也很可能对幂等性、导航和 GET 与 POST 不太了解。通过 POST 导航被认为是不好的做法。您可以通过将 ?faces-redirect=true 查询字符串附加到结果来发送重定向操作方法来应用 POST-redirect-GET 模式。

public void validate() {
    // ...

    return "product?faces-redirect=true";
}

另见How to navigate in JSF? How to make URL reflect current page (and not previous one)


与具体问题无关,操作方法名称给我留下的印象是您也没有意识到正确使用 JSF 验证器。在这种情况下,请仔细阅读JSF 2.0 validation in actionListener or action method

【讨论】:

  • 提供的链接中有很多很棒的材料。 product?faces-redirect=true 解决了这个问题。非常感谢您分享所有这些细节。
猜你喜欢
  • 2014-03-18
  • 2013-07-24
  • 2014-10-04
  • 1970-01-01
  • 2013-09-28
  • 2014-09-17
  • 1970-01-01
  • 2015-09-29
  • 2013-07-28
相关资源
最近更新 更多