gpt4 book ai didi

validation - JSF2 PRG 和验证错误

转载 作者:行者123 更新时间:2023-12-03 16:38:30 26 4
gpt4 key购买 nike

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

最佳答案

我面临着同样的挑战。没有找到 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 值( session 范围,使用 flash,view-params,...),您可以禁用浏览器缓存,从而在点击后退按钮时导致页面重新加载(GET 请求)。我使用以下代码在每个页面上执行此操作:

JSF 页面:

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

bean 类:

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 的后续使用。它应该重定向(而不是转发)无效表单。 (可能不是一项简单的任务,例如如何处理/重新显示无效字段?)。也许我错了,但感觉好像缺少类似的选项。

关于validation - JSF2 PRG 和验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22008546/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com