我的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 );
}
答案 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。
希望这有帮助。