我有一个JSF应用程序,用户在登录表单中登录他们的电子邮件和密码。 ManagedBean具有以下两种方法。
方法checkIdentity1()
返回一个URL(如果验证不正确则为“”,以便保持在同一页面;如果插入的数据正常,则返回/useraccount.xhtml以进入下一页)。< / p>
方法checkIdentity2()
返回一个布尔值(如果验证错误以显示消息,则为false,如果确定则为true)。
loginManagedBean.java
public String checkIdentity1()
{
String strResponse="";
//check id
if(email.equals("jose@a.com") && password.equals("1234"))
{
strResponse="/useraccount.xhtml?faces-redirect=true";
} else {
}
//
return strResponse;
}
public boolean checkIdentity2()
{
boolean bResponse=false;
//check id
if(email.equals("jose@a.com") && password.equals("1234"))
{
//setpassIncorrecta(false);
} else {
bResponse=true;
}
//
return bResponse;
}
我想要做的是混合ajax和JSF以显示“电子邮件和/或密码不正确”当我单击“登录”按钮并且验证失败并在验证正常时转到account.xhtml。但是当我插入错误的电子邮件和密码时,没有显示任何消息,当我正确插入它们时,页面没有重定向到account.xhtml。我做错了什么?
这是我的Facelet
<h:form>
<!--Email-->
<h:inputText id="email" label="email" required="true" size="32" maxlength="32"
value="#{loginManagedBean.email}"
requiredMessage="Insert your email">
</h:inputText>
<h:message for="email" />
<!--Password-->
<h:inputSecret id="password" label="password" required="true" size="32" maxlength="40"
value="#{loginManagedBean.password}"
requiredMessage="Insert your password">
</h:inputSecret>
<h:message for="password" />
<!--Button-->
<h:commandButton value="Login" action="#{loginManagedBean.checkIdentity1()}">
<f:ajax execute="@form" render=":loginErrorMessage" />
</h:commandButton>
</h:form>
<h:panelGroup id="loginErrorMessage">
<h:outputText value="Email and/or password incorrect" rendered="#{!loginManagedBean.checkIdentity2()}" />
</h:panelGroup>
答案 0 :(得分:1)
就像我在评论中解释的那样,这就是JSF的工作方式:如果请求未通过验证,则action
方法将不会被执行。这定义了JSF request processing lifecycle(我不会进入这里)。出于本答案的目的,您需要知道的是请求参数的验证在考虑action
方法之前发生。话虽如此,如果验证失败,请求处理在那里被短路。要实现您的目标,您应该考虑以下因素:
要有条件地呈现该组件,您可以检查页面中的验证状态:
<h:outputText value="Email and/or password incorrect" rendered="#{facesContext.validationFailed}" />
理想情况下,您应该只使用<h:messages/>
组件,而不需要自己管理邮件显示
如果验证失败,JSF将默认保留在同一页面上,因此您无需采取任何特殊步骤