【问题标题】:How to implement post-redirect-get when validation failed验证失败时如何实现post-redirect-get
【发布时间】:2014-01-10 13:37:58
【问题描述】:

我在“createDbUser.xhtml”视图中有一个表单,其中包含一些输入文本和验证,如下所示:

<h:form>
  <h:inputText id="user_name" value="#{dbUserManager.userName}" required="true" requiredMessage="User name is required." />
  <h:inputSecret id="password" value="#{dbUserManager.password}" required="true" requiredMessage="Password is required." />
  <h:commandButton id="create_user" value="Create user" action="#{dbUserManager.createUser()}" />
</h:form>

dbUserManger 是一个带有 createUser() 的 viewScoped 托管 bean,如下所示:

public String createUser()
{
  ...
  // here I do some checks and add the new user to database
  ...

  return "/restricted/createDbUser.xhtml?faces-redirect=true";
}

当我在某些验证失败时按下浏览器的刷新按钮(例如,我没有输入密码或用户名),我得到“确认表单重新提交”而不是预期的行为,即重新加载页面并清除输入.

我已经阅读了 post-redirect-get 模式,这就是为什么我将带有“faces-redirect=true”参数的 return 语句添加到 createuser() 的结果中。

我猜当验证失败时,我们永远不会到达 createuser() 并因此返回语句。这就是这个问题的原因。但是不知道怎么解决。

如果有人能帮助解决这个问题,那就太好了。

谢谢

【问题讨论】:

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


    【解决方案1】:

    你是对的:

    当在 JSF LifeCycles 验证阶段在服务器端识别出验证错误时,您的操作方法永远不会被调用(稍后将处于调用阶段)。

    我认为可能的解决方案:尝试在客户端进行验证 - 例如检查登录/密码是否存在,这可以通过h:commandButtons onclick-attribute 触发的javascript来实现。我不确定您是否使用 JSF2 以上的任何 *Faces-framework,但例如Richfaces4 还允许在不更改任何代码的情况下进行客户端验证。

    另一种可能的解决方案可能是通过 AJAX 发送表单,更改

    <h:commandButton action="#{dbUserManager.createUser()}" />
    

    类似

    <h:commandButton action="#{dbUserManager.createUser()}">
        <f:ajax execute="@form" render="@all" />
    </h:commandButton>
    

    在这里,您可能需要弄清楚如何在正确登录的情况下管理重定向到另一个屏幕。

    希望,这些想法可能会推动您进一步实现目标......

    【讨论】:

    • 感谢您的回复。有用。我使用 ajax 提交表单,如下所示: 顺便说一句,我重定向到另一个页面没有问题。
    猜你喜欢
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 2014-04-10
    • 2023-03-03
    • 2023-02-24
    • 1970-01-01
    相关资源
    最近更新 更多