3

我正在创建一个 JSF 表单,其中有一个电子邮件字段。我需要验证电子邮件格式并检查数据库的唯一性。

当最终用户输入电子邮件字段时,我需要检查这一点。如果它存在于数据库中,那么我们需要将字段颜色更改为红色,否则更改为绿色。我想通过ajax来执行这个。

我已经在 PHP 中看到了示例,但我不清楚如何在 JSF 中进行操作。

4

1 回答 1

9

对于一般电子邮件格式验证,您可以使用<f:validateRegex>.

<h:inputText id="email" value="#{bean.email}">
    <f:validateRegex pattern="([^.@]+)(\.[^.@]+)*@([^.@]+\.)+([^.@]+)" />
</h:inputText>
<h:message for="email" />

要对模糊执行验证,请添加<f:ajax event="blur">.

<h:inputText id="email" value="#{bean.email}">
    <f:validateRegex pattern="([^.@]+)(\.[^.@]+)*@([^.@]+\.)+([^.@]+)" />
    <f:ajax event="blur" render="m_email" />
</h:inputText>
<h:message id="m_email" for="email" />

Validator对于唯一的电子邮件验证,根据其约定实现 JSF接口。

@FacesValidator("uniqueEmailValidator")
public class UniqueEmailValidator implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        if (value == null) {
            return; // Let required="true" handle, if any.
        }

        String email = (String) value;

        if (yourUserService.existEmail(email)) {
            throw new ValidatorException(new FacesMessage(
                FacesMessage.SEVERITY_ERROR, "Email is already in use.", null));
        }
    }

}

并通过以下方式注册<f:validator>

<h:inputText id="email" value="#{bean.email}">
    <f:validateRegex pattern="([^.@]+)(\.[^.@]+)*@([^.@]+\.)+([^.@]+)" />
    <f:validator validatorId="uniqueEmailValidator" />
    <f:ajax event="blur" render="m_email" />
</h:inputText>
<h:message id="m_email" for="email" />

要更改组件的样式,您可以使用 EL instylestyleClass属性。

<h:inputText id="email" value="#{bean.email}" styleClass="#{component.valid ? (facesContext.postback ? 'ok' : '') : 'error'}">
    <f:validateRegex pattern="([^.@]+)(\.[^.@]+)*@([^.@]+\.)+([^.@]+)" />
    <f:validator validatorId="uniqueEmailValidator" />
    <f:ajax event="blur" render="@this m_email" />
</h:inputText>
<h:message id="m_email" for="email" />

为此,您不一定需要 jQuery。由于 jQuery 在客户端而不是服务器端运行(你知道,最终用户对在客户端运行的内容有 100% 的控制权),因此它的健壮性也会降低。

于 2012-06-19T04:58:05.037 回答