ValueChangeEvent getOldValue()为null

时间:2012-03-08 07:13:19

标签: java jsf

我的bean中有以下方法

    public void valueChange(ValueChangeEvent event){

        oldValue = (String) event.getOldValue();
        newvalue = (String) event.getNewValue();

 logger.info("values " + oldValue + " to " + newvalue );

在我的JSF中

 <h:selectOneListbox size="1" 
 value="#{bean.Emp}"   onchange="this.form.submit()"
 valueChangeListener="#{bean.valueChange}

我可以看到oldValue始终为空,这可能是什么原因?

我的JSF版本是1.1,页面范围是request

由于

更新1

支持Bean

public class EmpBackingBean {

    private String selectedItemEmp;

    public void selectedItemEmp(String selectedItemEmp) {
        this.selectedItemEmp= selectedItemEmp;
    }

    public String getSelectedItemEmp() {
        return selectedItemEmp;
    }

Managed Bean

    EmpBackingBean empBackingBean = new EmpBackingBean();


    public EmpBackingBean getVehDetBackingBean() {
        return empBackingBean ;
    }

public void valueChange(ValueChangeEvent event){

        oldValue = (String) event.getOldValue();
        newvalue = (String) event.getNewValue();

logger.info("values " + oldValue + " to " + newvalue );

}

2 个答案:

答案 0 :(得分:2)

如果符合您的预期,HTML表单不会提交最后呈现的表单值。

public class Bean {
  private Object emp;
  public Object getEmp() { return emp; }
  public void setEmp(Object emp) { this.emp = emp; }
}

旧值是提交表单时“bean”中的值。如果“bean”是请求范围,则每次都会创建一个新实例。我猜“Emp”没有初始化,所以它将为null。

答案 1 :(得分:-1)

以下是我之前编写的代码的精简版本,可以解决这个问题:

public void valeurChangeeListener(ValueChangeEvent event) {

    PhaseId phase = event.getPhaseId(); 

    if (!phase.equals(PhaseId.INVOKE_APPLICATION)) {    
        oldValue = yourBean.getYourValue();
        event.setPhaseId(PhaseId.INVOKE_APPLICATION);
        event.queue();
    } else {
        newValue = yourBean.getYourValue();
    }
}

当然,正如其他人所说,yourBean的范围必须长于requestScoped。

希望这有帮助。