我在“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是一个viewScoped托管bean,其createUser()如下所示:
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(),因此返回return语句。这就是造成这个问题的原因。但我不知道如何解决它。
如果有人帮助解决问题,那将是非常好的。
感谢
答案 0 :(得分:1)
你是对的:
在JSF LifeCycles验证阶段期间在服务器端识别验证错误时,永远不会调用您的操作方法(稍后在调用阶段)。
我认为可能的解决方案:尝试在客户端进行验证 - 例如检查登录/密码是否存在,这可以通过h:commandButton
s onclick
- 属性触发的javascript来实现。我不确定你是否在JSF2之上使用任何* Faces-framework,但是Richfaces4还允许客户端验证而无需更改任何代码。
另一种可能的解决方案可能是通过AJAX发送表单,更改
<h:commandButton action="#{dbUserManager.createUser()}" />
类似
<h:commandButton action="#{dbUserManager.createUser()}">
<f:ajax execute="@form" render="@all" />
</h:commandButton>
在这里,您可能需要弄清楚如何在正确登录的情况下管理重定向到另一个屏幕。
希望,这些想法可能会促使您进一步实现目标......