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