组件通过值绑定连接到支持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生命周期有关,但是我看到它的方式我正在改变组件在UI中绑定的属性值,因为我有一个实际组件的钩子我也改变了组件的值和submittedValue以确定(找到问题)并且仍然没有在UI中反映出更改?
任何想法??
答案 0 :(得分:3)
你正在使用错误的工具来完成工作。您应该使用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:应用请求值(input
为UIInput
且request
为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());