使用Primefaces / JSF对输入框进行实时验证

时间:2017-03-03 21:27:53

标签: jsf primefaces jsf-2

我需要知道是否有办法使用Primefaces / JSF进行实时验证?

我的要求看似简单:

  

我有一个输入框,只能使用唯一的名称。对于例如..,如果用户想要输入已存在于数据库中的名称,则为   应抛出“用户名已存在”等错误消息。这个   应该在用户移出输入框后立即发生

可以从Google注册页面推断出参考资料

我花了很多时间在互联网上进行研究,但还没有找到任何具体的解决方案。

我主要是在 Primefaces / JSF 中寻找解决方案。有可能吗?

2 个答案:

答案 0 :(得分:2)

你可以用普通的JSF做到这一点。您只需使用验证器并在输入字段中添加ajax行为,例如

<强>的facelet

<h:form id="form">
    <h:messages id="messages" />
    <h:inputText value="#{anyBean.username}" validator="userValidator">
        <f:ajax render="@this messages" />
    </h:inputText>
</h:form>

<强>验证

@FacesConverter("userValidator")
public class UserValidator implements Validator {

    @Override
    public void validate(FacesContext fc, UIComponent component, Object value) throws ValidatorException {
        String username = (String) value;
        if (usernameExists(username)) {
            throw new ValidatorException(new FacesMessage("User Name already exists."));
        }
    }

    private boolean usernameExists(String username) {
        // check if username exists here
    }
}

当然你也可以使用等效的PrimeFaces组件p:messages,p:inputText和p:ajax。

答案 1 :(得分:-1)

使用Primefaces,试试这个xhtml:

<h:form>
   <p:panel id="panel" header="Unique Name">
      <p:messages id="msgs" />
      <p:outputLabel for="uniqueName" value="UniqueName:" />
      <p:inputText id="uniqueName" value="#{yourMB.uniqueName}" required="true">
         <p:ajax update="msgUniqueName" event="keyup" listener="#{yourMB.check()}" />
      </p:inputText>
   </p:panel>
</h:form>

在您的ManagedBean中:

@ManagedBean
public class YourMB {

   private String uniqueName;
   private List<Name> listNames;

   public void check() {
      if(listNames == null) {
         listNames = nameService.getAllNamess(); 
         //you need declare & implement an appropriate service
      } else {
         for(Name name listNames) {
            if(name.getName().equals(uniqueName) {
               FacesMessage message = new FacesMessage(uniqueName + " already exists!");
               FacesContext.getCurrentInstance().addMessage(null, message );
            }
         }
      }
   }

   public String getUniqueName() {
      return uniqueName;
   }

   public void setUniqueName(String uniqueName) {
      this.uniqueName = uniqueName;
   }
}