home.xhtml
<p:button outcome="product" value="Login Simple Button"/>
<p:commandButton value="Login" action="#{homeController.validate}" update="logindialog"/>
产品.xhtml
<f:metadata> <f:viewAction action="#{productController.readProductGroup}" /> </f:metadata>
简单的 p:button 导航并成功调用 readProductGroup(); 但 p:commandButton 不会,即使 homeController.validate() 方法返回 'product' 并成功导航到 product.xhtml。
使用p:button,我无法灵活地调用服务器方法、使用我需要的更新属性等。
我需要的是,为了能够在主页.xhtml页面按钮中使用更新、操作/操作监听器等属性,同时导航到 product.xhtml,应该能够在页面加载时在 f:metadata 下调用函数 productController.readProductGroup。
请指教。
<f:viewAction>
设计为在GET请求上运行,而不是在POST请求上运行。要调用对 POST 请求的操作,您应该使用 <h:commandXxx>
。
如果您出于某种原因也确实想在 POST 请求上运行<f:viewAction>
,则只需将其 onPostback
属性设置为 true
。
<f:viewAction ... onPostback="true" />
另一方面,你也很可能对幂等性、导航和GET与POST不太了解。 通过开机自检导航被认为是不好的做法。您可以通过将?faces-redirect=true
查询字符串追加到结果来发送重定向操作方法,从而应用 POST-redirect-GET 模式。
public void validate() {
// ...
return "product?faces-redirect=true";
}
另请参阅如何在 JSF 中导航?如何使URL反映当前页面(而不是上一个页面)
与具体问题无关,操作方法名称给我留下的印象是你也不知道正确使用 JSF 验证器。在这种情况下,请仔细阅读 actionListener 或 action 方法中的 JSF 2.0 验证。