在jsf中验证后将字段设置为空白

时间:2013-03-17 06:47:52

标签: jsf richfaces ajax4jsf

我是JSF的新手并经历了一个JSF应用程序。

我想为空字符串验证一个密码字段。

我知道不是在Javascript中执行此操作,而是调用函数进行验证。

我需要的是,如果密码字段的值为空,那么它将从验证器功能验证,直到现在它正确运行但在验证之后它到达UI bav = ck,此时密码字段应为空。

如果密码字段为空(仅包含空格),那么我希望它将其设置为空白,或者保持数据不变。

我的尝试到现在为止, JSF查看页面singin.xhtml

                    <h:outputText styleClass="outputBox" style="margin: 3px;"
                        value="Password" />
                    <h:inputSecret id="password" required="true" 
                        requiredMessage="Please enter your password"
                        value="#{userActionManager.dto.password}" 
                        validator="#{userActionManager.validateSamePassword}">

                            <a4j:ajax event="change" execute="@this" bypassUpdates="true" />
                    </h:inputSecret>

验证方法。

    public void validateSamePassword(FacesContext fc, UIComponent component, Object obj) {
         System.out.println("UserActionManager.validateSamePassword()");

         String confirmPassword = (String)obj;
         System.out.println("Password is :" + confirmPassword);
            if(confirmPassword!=null && confirmPassword.trim().equals("")) {
              FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Password cannot be blank", " detail Passwords do not match!");

//            System.out.println(component.getFamily());
//            String field1Id = (String) component.getAttributes().get("password");

              // Find the actual JSF component for the client ID.
//            UIInput textInput = (UIInput) fc.getViewRoot().findComponent("password");
//            textInput.setValue("");

              dto.setPassword(null);

              throw new ValidatorException(message);
            }else{
                dto.setPassword(confirmPassword);
            }
    }

我尝试了选项dto.setPassword(null);但当它返回到视图时,密码字段中的空格仍然存在,我必须手动删除。

我缺少什么?

2 个答案:

答案 0 :(得分:1)

在验证程序中,在resetValue()的实例上调用UIComponent作为参数传递

public void validateSamePassword(FacesContext fc, UIComponent component, Object obj) {
     System.out.println("UserActionManager.validateSamePassword()");

     String confirmPassword = (String)obj;
     System.out.println("Password is :" + confirmPassword);
        if(confirmPassword!=null && confirmPassword.trim().equals("")) {
          FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,   "Password cannot be blank", " detail Passwords do not match!");

          component.resetValue();

          throw new ValidatorException(message);
        }else{
            dto.setPassword(confirmPassword);
        }
}

dto.setPassword(null)不会影响密码框中的值,因为输入组件旨在保留导致验证失败的值。 resetValue()是一种方法,会导致组件将其值重置为未初始化状态

编辑:上述解决方案过早地重置输入值。从技术上讲,验证在引发ValidationException之前不会失败。要有效地重置字段:

  1. 定义一个侦听器事件,该事件仅在验证失败后重置组件的值

    public void resetPwd(ComponentSystemEvent evt) throws IOException {
    HtmlInputSecret txt = (HtmlInputSecret) evt.getComponent();
    if(!txt.isValid()){ //make sure that the validation failed 
        txt.resetValue();
       }
    
    }
    
  2. 将侦听器事件附加到密码组件上的postValidate事件侦听器。这将确保仅在验证失败后重置该值。

      <h:inputSecret id="password" required="true" 
                    requiredMessage="Please enter your password"
                    value="#{userActionManager.dto.password}" 
                    validator="#{userActionManager.validateSamePassword}">
                        <f:event name="postValidate" listener="#{userActionManager.resetPwd}"/>
                        <a4j:ajax event="change" execute="@this" bypassUpdates="true" />
                </h:inputSecret>
    
  3. 这里的关键是在正确的时间重置值。其他时间选项包括preRenderView事件和postAddToView事件。一切都在时机

答案 1 :(得分:1)

如果组件标记为无效,则它不会重新显示模型值(在您的情况下,是dto的值)。相反,它将重新显示其submitted value。您只需将提交的值设置为空字符串。

替换

dto.setPassword(null);

通过

((UIInput) component).setSubmittedValue("");