当验证失败时如何实现POST-重定向-GET

3
我有一个表单在视图“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>

dbUserManager是一个视图作用域的托管bean,其中包含如下的createUser()方法:
public String createUser()
{
  ...
  // here I do some checks and add the new user to database
  ...

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

当我在验证失败的情况下(例如,我没有输入密码或用户名)按下浏览器的刷新按钮时,我得到了“确认重新提交表单”的提示,而不是期望的行为,即重新加载页面并清除输入内容。
我已经了解了后重定向获取模式,并因此向createuser()的结果添加了带有“faces-redirect=true”参数的返回语句。
我猜当验证失败时,我们永远不会到达createuser(),因此也无法执行返回语句。这就是问题的原因。但我不知道该如何解决它。
如果有人能帮助解决这个问题,那就太好了。
谢谢
1个回答

1

你是正确的:

当JSF生命周期验证阶段在服务器端识别到验证错误时,您的操作方法将永远不会被调用(稍后在调用阶段中)。

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

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

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

转换成类似这样的内容
<h:commandButton action="#{dbUserManager.createUser()}">
    <f:ajax execute="@form" render="@all" />
</h:commandButton>

如果登录正确,您可能需要想出如何管理重定向到另一个屏幕。

希望这些想法能够推动您更进一步实现目标...


谢谢您的回复。它有效了。我使用ajax提交表单,像这样: <h:commandButton id="create_user" value="创建用户" action="#{dbUserManager.createUser()}"> <f:ajax execute="@form" render="@form" /> </h:commandButton> 顺便说一下,我在重定向到另一个页面时没有遇到任何问题。 - Ali Fakhraee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接