2013-11-15 41 views
2

在我的申請,我有以下Validator驗證驗證碼輸入:如何清除Validator類中的輸入字段?

@Named(value = "simpleCaptchaValidator") 
@RequestScoped 
public class SimpleCaptchaValidator implements Validator { 

    @Override 
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { 
     HttpSession session  = (HttpSession) context.getExternalContext().getSession(false); 
     Captcha  secretCaptcha = (Captcha) session.getAttribute(Captcha.NAME); 

     // Clear the input field 
     EditableValueHolder input = (EditableValueHolder) component; 
     input.resetValue(); 

     // Display an error msg if the entered words are wrong 
     if (!secretCaptcha.isCorrect(value.toString())) { 
      FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Failed!", "You have entered wrong words."); 
      throw new ValidatorException(msg); 
     } 
    } 
} 

以上Validator適用於非Ajax請求偉大的,當用戶不輸入錯誤驗證碼的話。但是,如果用戶輸入正確的驗證碼字,但其他組件上的驗證失敗,則驗證碼的輸入字段不會被清除。

如果您能告訴我如何解決上述問題,我將不勝感激。

+0

請顯示一些相關的視圖代碼。 – user1983983

+0

嗯,我想在無效驗證碼的情況下,你可能想從會話中刪除值? session.setAttribute(Captcha.NAME)=「」; – JBA

回答

2

它不起作用,因爲在錯誤的時刻調用了EditableValueHolder#resetValue()。您應該在調用應用程序階段(至少在更新模型值階段之後)調用它,而不是在驗證階段的中間。也就是說,當validate()方法毫無例外地返回時,JSF仍然會將驗證值設置爲組件的本地值。當驗證階段一般失敗時,則不會調用更新模型值階段,並且局部值仍然會在組件中出現。

根據迄今爲止提供的信息,不可能提出正確的方法。如果這是一個自定義組件,那麼在encode()期間不要寫入該值。或者,如果這是一個現有組件,那麼最好的辦法是創建一個自定義轉換器,將提交的值作爲自定義組件屬性存儲,然後返回getAsObject()中的null。在驗證器中,您只需將該自定義組件屬性作爲值來獲取。作爲最後的手段,附上一個PhaseListener,它可以在適當的時候重置組件。

+0

非常感謝您的明確解釋:)。我會嘗試你的建議。 –