在使用 p:commandButton 导航时调用 f:viewAction 中的操作

Posted

技术标签:

【中文标题】在使用 p:commandButton 导航时调用 f:viewAction 中的操作【英文标题】:Invoke action in f:viewAction while navigating using p:commandButton 【发布时间】: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 并使其工作。 【参考方案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 解决了这个问题。非常感谢您分享所有这些细节。

以上是关于在使用 p:commandButton 导航时调用 f:viewAction 中的操作的主要内容,如果未能解决你的问题,请参考以下文章

使用片段导航(导航图)导航时调用目标片段的函数/方法

在导航控制器中单击后退按钮时调用哪个方法?

React Native Navigation 在登录后导航到主页时调用所有屏幕 componentDidMount/componentWillMount

导航到新选项卡时调用异步函数

p:commandButton 操作抛出 javax.el.PropertyNotFoundException

p:commandButton 操作抛出 javax.el.PropertyNotFoundException