自定义验证和组件重置

时间:2012-01-25 15:00:22

标签: jsf richfaces

编辑:我有这段代码:

<h:inputText id="email_id" value="#{CreateUserManager.email}" 
        styleClass="#{CreateUserManager.emailPrimariaValid ? '' : 'inputErrorClass'}">
    <f:validator validatorId="EmailValidator" />
    <a4j:support event="onblur" reRender="email_id, messages" oncomplete="setAnchor();"                         
        status="status4divCoverAll" ajaxSingle="true" />
</h:inputText>

这是托管会话bean:

public class CreateUserManager {
...
protected boolean emailPrimariaValid;

public CreateUserManager() {
    ...
    this.emailPrimariaValid = true;
}


public boolean isEmailPrimariaValid() {
    FacesContext context = FacesContext.getCurrentInstance();
    UIInput input = (UIInput)context.getViewRoot().findComponent(":createUser:email_id");
    return input.isValid();
}

public void setEmailPrimariaValid(boolean emailPrimariaValid) {
    this.emailPrimariaValid = emailPrimariaValid;
}

}

请记住,如果我来自另一个页面(url),我会从会话中删除此bean,因此bean会再次执行构造函数。

问题:我写了一个无效的电子邮件,它正确地将类设置为inputErrorClass,但是如果我转到另一个页面(所以输入组件仍然无效)然后回到第一个,该类仍然是inputErrorClass

2 个答案:

答案 0 :(得分:0)

你是否有机会使用Seam?当出现错误时,它有一些很好的功能来设置输入元素的样式。

在Seam 2中,您可以使用<s:decorate>代码:http://docs.jboss.org/seam/2.2.0.GA/reference/en-US/html/controls.html#d0e28688

在Seam 3中,您可以使用UIInputContainer和复合组件:http://jerryorr.blogspot.com/2011/10/replacement-for-sdecorate-in-seam-3.html

如果您没有使用Seam ......那么,您可以查看Seam源代码,看看他们做了什么!

答案 1 :(得分:0)