【问题标题】:How to clear an input field in the Validator class?如何清除 Validator 类中的输入字段?
【发布时间】:2013-11-28 20:22:30
【问题描述】:

在我的应用程序中,我有以下 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 请求。但是,如果用户输入了正确的验证码,但在其他组件上验证失败,则验证码的输入字段不会被清除。

如果您能告诉我如何解决上述问题,我将不胜感激。

【问题讨论】:

  • 请显示一些相关的视图代码。
  • 好吧,我想如果验证码无效,您可能想从会话中删除该值? session.setAttribute(Captcha.NAME) = "";

标签: jsf-2 input reset validation


【解决方案1】:

它不起作用,因为 EditableValueHolder#resetValue() 在错误的时刻被调用。您应该在调用应用程序阶段(至少在更新模型值阶段之后)调用它,而不是在验证阶段的中间。即当validate()方法无异常返回时,JSF仍会将验证值设置为组件的本地值。当验证阶段通常失败时,将不会调用更新模型值阶段,并且本地值仍然存在于组件中。

根据目前提供的信息,不可能提出正确的方法。如果这是一个自定义组件,那么就不要在encode() 期间写入值。或者,如果这是一个现有组件,那么最好的办法是创建一个自定义转换器,将提交的值存储为自定义组件属性,然后在getAsObject() 中返回null。在验证器中,您只需将该自定义组件属性作为值获取。作为最后的手段,附加一个PhaseListener,它会在适当的时候重置组件。

【讨论】:

  • 非常感谢您的清晰解释:)。我会试试你的建议。
猜你喜欢
  • 2017-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 2016-07-20
  • 2022-11-17
  • 2018-10-04
  • 1970-01-01
相关资源
最近更新 更多