2012-03-08 27 views
1

我有我的豆ValueChangeEvent getOldValue()爲null

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

你能檢查一下,你的valueChange事件是否正在執行? – Kushan 2012-03-08 08:21:37

+0

是的,它確實執行。 'logger.info(「values」+ oldValue +「to」+ newvalue);'是來自'public void valueChange(ValueChangeEvent event){'的comin另外我可以看到來自'event.getNewValue()'的信息值 – user75ponic 2012-03-08 08:24:10

+0

onchange事件可能是原因。如果您手動提交表單,例如用commandButton? – 2012-03-08 08:24:18

回答

2

HTML表單不提交最後呈現的表單值,如果那是什麼你正在期待。

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

舊值是表單提交時「bean」中的值。如果「bean」是請求範圍,則每次都會創建一個新實例。我猜「Emp」沒有被初始化,所以它會是空的。

+0

我已經初始化如下'public void setSelectedItemEmp(String selectedItemEmp){this.selectedItemEmp = selectedItemEmp; 「或者我仍然失去了一些東西? – user75ponic 2012-03-08 09:42:39

+0

通常只有在提交表單時纔會調用setter(除非以其他邏輯進行)。表單提交時,它會嘗試解析'bean'以更新'emp'屬性。 'bean'是請求範圍,所以沒有保留最後的請求。一個新實例被創建並放入範圍。 getter被調用並返回null。 「ValueChangeEvent」是使用舊值(空值)和新的傳入值創建的。 _I'm在這裏做一些假設,但是你沒有提供太多的代碼._ – McDowell 2012-03-08 09:49:27

+0

我已經將上面的代碼添加爲更新1.沒有改變範圍,也沒有改變onChange是否有可能得到oldValue? – user75ponic 2012-03-08 11:15:53

-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。

希望這會有所幫助。

+0

這是一個笨拙的方法。只需使用'event.getOldValue()'和'event.getNewValue()'。 – BalusC 2012-09-16 11:16:51