2013-03-17 6 views
1

Я новичок в JSF и просматриваю одно приложение JSF.поле настройки пустым после проверки в jsf

Я хочу проверить одно поле «Пароль» для строки «Пустое».

Я знаю вместо того, чтобы делать это в Javascript, я вызываю функцию для проверки.

Моя потребность в том, что если значение поля пароля пуст, оно проверяется с помощью функции валидатора, пока оно не будет корректно, но после проверки, когда оно придет = s в 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); но когда он возвращается к просмотру, пустое поле в поле пароля все еще существует, и мне нужно вручную удалить.

что мне не хватает?

ответ

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() - это метод, который заставит компонент сбросить его значение в неинициализированное состояние

EDIT: Решение выше сбрасывает входное значение преждевременно. Технически валидация не сработает до тех пор, пока не будет выброшен 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> 
    

Ключевым моментом здесь является, чтобы сбросить значение в нужное время. Другие варианты времени включают событие preRenderView и событие postAddToView. Все в порядке

+0

component.resetValue(); такого метода на UIComponent нет. Я попробовал как ((UIInput) компонент) .resetValue(), и я обнаружил, что resetValue есть в UIInput. Все еще нет успеха. пустое значение все еще присутствует в поле, и я хочу дать понять. – Jayesh

+0

@JayeshPatel, на самом деле это имеет смысл. Виноват. Технически валидация не сработает, пока вы не выбросите «ValidationException». Нынешнее решение, которое я предложил, преждевременно перезагружает значение. См. Мое обновление для более подходящего времени. – kolossus

+0

'resetValue()' не определен в 'UIComponent'. Он определен в интерфейсе «EditableValueHolder», который реализован, среди прочего, «UIInput». – BalusC

1

Если компонент отмечен как недействительный, то он не будет отображать значение модели (в вашем случае значение от dto). Вместо этого он отобразит его submitted value. Вам просто нужно установить переданное значение в пустую строку.

Заменить

dto.setPassword(null); 

от

((UIInput) component).setSubmittedValue(""); 
Смежные вопросы