在使用 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】:<f:viewAction>
设计为在 GET 请求上运行,而不是在 POST 请求上运行。要对 POST 请求调用操作,您应该使用 <h:commandXxx>
。
如果您出于某种原因也确实想在 POST 请求上运行 <f:viewAction>
,那么只需将其 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