我有一个ajax事件模糊,用于验证数据库中是否已存在电子邮件并且它是否有效。
<h:outputText value="Email:" />
<p:inputText id="email" value="#{pessoaBean.pessoa.email}"
required="true" requiredMessage="Informar o email."
validatorMessage="Formato de email inválido" >
<p:ajax event="blur" listener="#{pessoaBean.verificaEmail}"
update="mensagens" />
<f:validateRegex
pattern="^[_A-Za-z0-9-\+]+(\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\.[A-Za-z0-9]+)*(\.[A-Za-z]{2,})$" />
</p:inputText>
Bean方法:
public void verificaEmail() {
if (new PessoaDao().verificaEmail(pessoa) == true) {
FacesContext.getCurrentInstance().addMessage("formCadastrar:email",
new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error",
"email already exist"));
}
}
当我使用commandbutton提交表单时,它会通过我的ajax validaton并提交我的表单,即使它在屏幕上显示我的错误消息。
我的按钮代码:
<p:commandButton value="Cadastrar"
actionListener="#{pessoaBean.cadastrar}"
update=":formPrincipal:tabelaPessoas,formCadastrar"
oncomplete="if (!args.validationFailed){PF('dialogCadastrar').hide();} "
/>
这里发生了什么?
答案 0 :(得分:3)
不要在侦听器方法中进行验证工作,因为JSF有适当的验证器。根据官方docs:
单个验证器应检查它们传递的值和组件,并抛出包含FacesMessage的ValidatorException,记录任何符合所需规则的失败。
所以让我们实现你需要的那个:
@FacesValidator("emailValidator")
public class EmailValidator implements Validator{
@Override
public void validate(FacesContext context, UIComponent component,
Object value) throws ValidatorException {
if (new PessoaDao().verificaEmail(value.toString()) == true) {
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error",
"email already exist"));
}
}
}
}
然后,您只需将验证器附加到您感兴趣的输入:
<p:inputText id="email" value="#{pessoaBean.pessoa.email}"
required="true" requiredMessage="Informar o email."
validatorMessage="Formato de email inválido" validator="emailValidator" />
这当然可以改进,您可以将正则表达式验证添加到代码本身,并实现您自己的电子邮件输入复合组件以供重用,并且已经包含验证器。
另见: