【问题标题】:Validate email format and uniqueness against DB针对 DB 验证电子邮件格式和唯一性
【发布时间】:2012-06-21 02:30:12
【问题描述】:

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

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

我在 PHP 中看到过示例,但我不清楚如何在 JSF 中做到这一点。

【问题讨论】:

    标签: jquery ajax validation jsf-2


    【解决方案1】:

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

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

    要对模糊进行验证,请添加&lt;f:ajax event="blur"&gt;

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

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

    @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));
            }
        }
    
    }
    

    并通过&lt;f:validator&gt;注册

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

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

    <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% 控制在客户端运行的内容),因此它的健壮性也会降低。

    【讨论】:

    • @Pattern(regexp = "([^.@]+)(\\.[^.@]+)*@([^.@]+\\.)+([^.@]+)", message = "Email is not in valid format") private String email; 可以在实体级别移动电子邮件验证。唯一性验证是否也可以在实体中移动?
    猜你喜欢
    • 2021-08-22
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    相关资源
    最近更新 更多