JSF2 PRG和验证错误

时间:2014-02-25 08:32:13

标签: validation jsf-2 post-redirect-get

我还没有找到使用JSF2确定PRG模式的实现。
BalusC博客提供a very good solution,但正如作者自己所说,这样的解决方案不适用于JSF2。
如果没有发生验证错误,The solutions based on Flash scope工作正常,但是如果验证错误,则不执行REDIRECT,因为生命周期不会调用NavigationHandler。假设浏览器没有缓存页面(在HTTP响应中设置正确的标题),如果发生验证错误并且用户单击“重新加载”浏览器按钮,则执行POST而不是GET。
实现强大的PRG模式的最佳实践是什么,该模式甚至可以使用JSF2进行验证错误?

1 个答案:

答案 0 :(得分:0)

我面临同样的挑战。没有找到100%令人满意的解决方案。但请看this approach from BalusC。如果在没有浏览器缓存控制的情况下点击浏览器后退按钮,此解决方案将不会保留值。

<h:form>
  <h:inputText id="somefield" required="true" value="#{formbean.someProperty}"/>
  <h:message for="somefield" />
  <h:commandButton value="POST with redirect and ajax" action="third?faces-redirect=true">
    <f:ajax execute="@form" render="@form" />
  </h:commandButton>
</h:form>

加载页面,将字段留空,发布表单( - >出现错误消息),输入数据,再次发布,然后点击后退按钮。这将再次显示该表单,错误消息已经消失,但输入字段值也已消失。

假设您以某种方式保留formbeans值(会话范围,使用flash,view-params,...),您可以在按下后退按钮时禁用浏览器缓存,从而导致页面重新加载(GET请求)。我每页都使用以下代码执行此操作:

JSF页:

<f:view>
  <f:event type="preRenderView" listener="#{formbean.doNotCache}"/>
</f:view>

豆:

public void doNotCache(ComponentSystemEvent event) {
  // Using Omnifaces to simplify code
  Faces.getResponse().setHeader("Pragma", "no-cache");
  Faces.getResponse().setHeader("Cache-Control", "no-cache");
  Faces.getResponse().addHeader("Cache-Control", "must-revalidate");
  Faces.getResponse().addHeader("Cache-Control", "no-store");
}

我将看看这个解决方案是否适用于真实世界的网站。在我看来,它们应该是验证系统的配置选项,随后使用Post-Redirect-Get-Pattern。它应该重定向(而不是转发)无效表单。 (可能不是一个简单的任务,例如如何处理/重新显示无效字段?)。也许我错了,但感觉缺少类似的选择。