【问题标题】:Ajax validation, different MessagesAjax 验证,不同的消息
【发布时间】:2014-02-15 11:57:28
【问题描述】:

大家好,我在 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>

【问题讨论】:

    标签: ajax jsf jsf-2 primefaces


    【解决方案1】:

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

    1. XHTML 文件

    1. Bean 代码

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

    【讨论】:

      【解决方案2】:

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

      1. id="email" 元素中删除validatorMessage 属性。同时删除该输入元素中的 f:validateRegex 验证器。
      2. 创建自定义验证器。它应该:
        • 有一个@ManagedBean(或类似的)注解(以便您的JSF 页面中的EL 可以引用它)
        • 实现javax.faces.validator.Validator
        • 覆盖validate() 方法。在其中您进行验证,例如检查您的正则表达式并通过例如查询数据库以获取现有地址JPA(或 EJB 业务方法)。如果验证失败,您会抛出一个 javax.faces.validator.ValidatorException,它是由一个包含相关错误消息的 javax.faces.application.FacesMessage 实例构造的(有各种构造函数,请找到适用的构造函数)。
        • 如果您不想在此验证器中编写代码,而是从 JSF 页面“传入”,您可以通过属性传递来实现。如果你有用,例如会想要传入您的(i18z'ed)错误消息、表单上其他字段的值等。默认情况下,validate() 方法中唯一可用的东西是 FacesContext、UIComponent 和值验证。 (请参见下面的示例。)
      3. 修改您的 JSF,类似于以下示例。

      示例 - 验证器类:

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

      示例 - JSF sn-p:

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

      好吧,上面的例子可能并不完整,但可能会为您指明正确的方向。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-09
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        相关资源
        最近更新 更多