jsf视图未验证ajax模糊

时间:2014-07-17 02:11:03

标签: ajax jsf-2 primefaces

我有一个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();} " 
    />

这里发生了什么?

1 个答案:

答案 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" />

这当然可以改进,您可以将正则表达式验证添加到代码本身,并实现您自己的电子邮件输入复合组件以供重用,并且已经包含验证器。

另见: