【问题标题】:change value in backing bean not reflected in UI支持 bean 中的更改值未反映在 UI 中
【发布时间】:2010-12-07 14:07:03
【问题描述】:

组件通过值绑定连接到支持 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 中绑定到组件的属性的值 op,并且因为我对实际组件有一个钩子,所以我也更改了确定组件的值和提交的值(以找到问题),但更改仍未反映在 UI 中?

有什么想法吗??

【问题讨论】:

    标签: java jsf


    【解决方案1】:

    您为这项工作使用了错误的工具。您应该为此使用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 阶段:应用请求值(inputUIInputrequestHttpServletRequest

      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());
      

    【讨论】:

    • 事实是,首先会进行一些验证,最后如果验证正常,但数字是 9 位而不是 10,则必须对其进行编辑以包含前导 0。我省略了额外的验证为简洁起见,但根本不可能在验证器方法中编辑此值吗?除了验证器方法之外,我还需要为此提供一个转换器吗?我知道这更干净,但我想知道在 jsf 生命周期中是否在技术上可行?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 2013-08-05
    • 1970-01-01
    • 2018-03-27
    • 2020-05-18
    • 1970-01-01
    相关资源
    最近更新 更多