编程语言
首页 > 编程语言> > java-更改后备bean中的值未反映在UI中

java-更改后备bean中的值未反映在UI中

作者:互联网

该组件通过值绑定连接到支持bean属性.

<h:inputText id="number" value="#{backingBean.number}" validator="#{backingBean.validateNumber}" />

在验证方法中,数字值已更改

public void validateNumber(FacesContext facesContext, UIComponent component, Object value) {
    String inputValue = (String) value;

    if (inputValue.length() == 9) {
        inputValue = "0" + inputValue;
        ((UIInput) component).setSubmittedValue(inputValue);
        ((UIInput) component).setValue(inputValue);
        setNumber(inputValue);
    }
}

在调试时,我可以验证该值实际上是否已更改,但是在渲染阶段,新值会以某种方式被旧值覆盖.
这一定与我误解了JSF生命周期有关,但是从我的角度来看,我正在更改OP中绑定到组件的属性的值op,以及因为我对实际组件都有一个钩子,所以我也进行了更改组件的值和SubmittedValue是否可以确定(以查找问题),并且更改仍未反映在UI中?

有任何想法吗??

解决方法:

您为该工作使用了错误的工具.为此,您应该使用Converter,而不是Validator.验证器用于验证值,而不是更改(转换)值.

public void EnterpriseNumberConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        if (value.length() == 9) {
            value = "0" + value;
        }
        return value;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        return (String) value;
    }

}

至于为什么不能在验证器中进行验证,这基本上是正在发生的事情:

>阶段2:应用请求值(输入为UIInput,请求为HttpServletRequest)

input.setSubmittedValue(request.getParameter(input.getClientId()));

>阶段3:验证阶段.

Object value = input.getSubmittedValue();
try {
    value = input.getConvertedValue(facesContext, value);
} catch (ConverterException e) {
    // ...
    return;
}
try {
    for (Validator validator : input.getValidators())
        validator.validate(facesContext, input, value);
    }
    input.setSubmittedValue(null);
    input.setValue(value); // You see?
} catch (ValidatorException e) {
    // ...
}

>阶段4:更新模型值阶段.

bean.setProperty(input.getValue());

标签:jsf,java
来源: https://codeday.me/bug/20191208/2095096.html