Ajax验证,不同的消息

时间:2014-02-15 11:57:29

标签: ajax jsf jsf-2 primefaces

大家好我在JSF验证时遇到了问题。我想验证一个邮件地址,如果它已经被使用和正确的邮件格式。这是它应该看起来的图片。 https://www.dropbox.com/s/bs9nshmuurauc2e/Unbenannt.JPG 我希望能理解这个问题。我现在不知道如何实现它。 我可以为不同的事件设置不同的消息吗?

我使用primefaces 3.5和jsf 2.1

<p:row>
    <p:column style="width:400px">
        <h:outputLabel for="email" styleClass="outputRight" value="#{msg['regi_mail']}" />
    </p:column>
    <p:column style="width:350px">
        <p:inputText style="width:350px" requiredMessage="#{msg['regi_mail_valid']}" validatorMessage="#{msg['regi_mail_valid']}" id="email" value="#{regiBean.user.EMAIL}" required="true">
            <f:validateRegex pattern="^[_A-Za-z0-9-\+]+(\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\.[A-Za-z0-9]+)*(\.[A-Za-z]{2,})$" />
            <f:ajax event="blur" render="format user" />

        </p:inputText>
    </p:column>
    <p:column style="width:410px">
        <h:panelGroup id="mail" class="fa fa-question-circle fa-2x" />
        <p:overlayPanel for="mail" showEvent="mouseover" hideEvent="mouseout" hideEffect="fade">
            <p:panel>
                TEXTTEXTTEXT
            </p:panel>
        </p:overlayPanel>
        <p:message id="format" for="email" />
    </p:column>
</p:row>

<p:row>
    <p:column style="width:400px">
        <h:outputLabel styleClass="outputRight" value="Username" />
    </p:column>
    <p:column style="width:350px">
        <h:outputLabel id="user" style="color: green;" value="#{regiBean.user.EMAIL}" />
    </p:column>
    <p:column>
        <h:panelGroup id="us" class="fa fa-minus-square fa-2x" />
        <h:panelGroup/>
    </p:column>
</p:row>

2 个答案:

答案 0 :(得分:1)

我做过类似的事,但前端只是不同。

  1. XHTML文件
  2. Front-end xhtml file

    1. Bean Code
    2. Setter and getter

      validateEmail Method

      Email Format and Email Present or Not in ur DB

      我希望你能从中得到一些帮助。

答案 1 :(得分:0)

这可能有点晚了,我看到问题已在2月份提出。但是,似乎这应该是您应该提供自定义验证器的情况。这是我的建议:

  1. 从您validatorMessage元素中删除id="email"属性。同时删除该输入元素中的f:validateRegex验证程序。
  2. 创建自定义验证程序。这应该:
    • 拥有@ManagedBean(或类似)注释(以便JSF页面中的EL可以引用它)
    • 实施javax.faces.validator.Validator
    • 覆盖validate()方法。在其中,您可以进行验证,例如:检查您的正则表达式以及查询数据库中的现有地址,例如JPA(或EJB业务方法)。如果验证失败,则抛出javax.faces.validator.ValidatorException,该javax.faces.application.FacesMessage由包含相关错误消息的validate()实例构成(有各种构造函数,找到适用的构造函数)。
    • 如果你不想在这个验证器中编写代码,但是从JSF页面“传入”,你可以通过属性传递来实现。有用的,例如你我想传递你的(i18z'ed)错误信息,表格上其他字段的值等等。默认情况下@ManagedBean public class MyEmailValidator implements Validator { @EJB UserEJBLocal userEJB; // supposing you want to use a method in there to get list of e-mail addresses private static final String REGEXP = "^[_A-Za-z0-9-\+]+(\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\.[A-Za-z0-9]+)*(\.[A-Za-z]{2,})$"; @Override public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { if (! Pattern.matches(REGEXP, value.toString())) { throw new ValidatorException(new FacesMessage(component.getAttributes().get("formatMsg"))); } List existingAddresses = userEJB.getAllAddresses(); // or whatever method your are using to obtain current addresses, e.g. JPA. if (existingAddresses.contains(value.toString()) { throw new ValidatorException(new FacesMessage( FacesMessage.SEVERITY_ERROR, "The address already exists." // could also be passed in as attribute, etc. )); } } } 方法中唯一可用的东西是FacesContext,UIComponent和值这是有效的。 (见下面的例子。)
  3. 修改您的JSF,类似于以下示例。
  4. 示例 - Validator类:

    <p:inputText id="email" value="#{regiBean.user.EMAIL}"
           requiredMessage="#{msg['regi_mail_valid']}" required="true"
    >
       <f:validator binding="${myEmailValidator}" />
       <f:attribute name="formatMsg" value="#{msg['regi_mail_valid']}" />
       : <!-- other attributes, if needed -->
       <f:ajax event="blur" render="email-msg user" />
    </p:inputText>
    :
    <p:message id="email-msg" for="email" />
    

    示例 - JSF代码段:

    {{1}}

    嗯,上面的例子可能不完整,但可能会指出你正确的方向。

    好的,那么也许您想要检查当前行的电子邮件与其他行中的电子邮件?你有点不幸...我能想到的唯一方法是以某种方式将它们全部收集到一个列表中,你可以通过另一个属性传递给验证器。动态表格不是很容易......您可能想重新考虑一下您的流程。