JSF根据验证从bean更新值的正确方法



我有一个与页面相关联的扣紧bean,我想根据验证是失败还是成功来更改它的值。

@ManagedBean(name = "testBean")
@ViewScoped()
public class TestBean implements Serializable {
String value="";
int number;
  /*getters-setters*/
}

检查数字是否为正的验证器

@FacesValidator("Validator")
public class NumValidator implements Validator{

    @Override
    public void validate(FacesContext context, UIComponent component,
            Object value) throws ValidatorException {
        int num=(Integer)value;
        if(num<0){
            FacesMessage msg = 
                new FacesMessage(The number is negative");
            msg.setSeverity(FacesMessage.SEVERITY_ERROR);
            throw new ValidatorException(msg);
           }

    }
}

和一个xhtml页面:

<h:form>
<h:inputText id="number" value="#{testBean.number}" required="true"
                    requiredMessage="Is">
                    <f:validator validatorId="Validator" />
                    <f:ajax event="blur" render="msg" />
                </h:inputText>
                <h:message id="msg" for="number"/>
</h:form>

并且我希望bean中的String为value="negative"或value="positive",无论情况如何。如何做到这一点?

您的具体功能需求似乎可以归结为:

我如何改变<h:inputText>的样式类时,它有一个验证错误?

在这种情况下,只需检查EL中的UIInput#isValid()。当前的UI组件仅通过隐式EL对象#{component}可用。

<h:inputText ... styleClass="#{component.valid ? 'positive' : 'negative'}">
    <f:ajax ... render="@this msg" />
</h:inputText>

请注意,我将@this添加到render中,否则组件本身不会更新。

你不应该用特定于视图的属性(比如CSS类)污染模型。你应该尽量把它们放在视图侧。这将以更"自然"的解决方案告终。

最新更新