I'm currently experiencing a strange phenomena, where setting the value to the model happens before executing valueChangeListener.
Basically what i would like to happen is :
But what happens when i run it is in this order, 1 - 3 - 2 - 4 (not 1 - 2 - 3 - 4 as i imagined)
Here's the part of the UI :
<h:selectOneMenu label="budget" id="budget"
converter="genericConverter"
value="#{myBean.budget}"
valueChangeListener="#{myBean.actionSearch}">
<f:ajax render="myGrid" />
<f:selectItem itemLabel="Choose one .." noSelectionOption="true" />
<f:selectItems ... />
</h:selectOneMenu>
And this is the excerpt from the bean :
public void actionSearch() {
System.out.println("searching with this.budget == " + this.budget);
...
}
public void setBudget(String budget) {
System.out.println("setting budget : " + budget);
this.budget = budget;
}
And this is the output :
searching with this.budget == xxxx
setting budget : yyyy
What i would like is, setting the budget first from the new value selected in the UI, and then start searching based on the new UI. But i dont know how to achieve that.
And im using Tomcat 7 along with these :
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.0.4-b09</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.0.4-b09</version>
<scope>compile</scope>
</dependency>
I wonder what i did wrong ?
Thank you !
The valueChangeListener
is executed during Validations phase, before the Update Model Values phase. It is intented to be able to get a handle of both the old and new value so that you can if necessary do some business stuff (logging?) based on the real change. In JSF 1.x this was however more than often (ab)used to invoke actions on a dropdown change only, but it has to be used in combination with onchange="submit()"
, immediate="true"
, FacesContext#renderResponse()
and other stuffs. The selected value is to be obtained by ValueChangeEvent#getNewValue()
(the ValueChangeEvent
is supposed to be definied as method's argument).
For JSF 2.x you don't need the valueChangeListener
anymore in such case. You're also not interested in the old value anyway. Use the listener
attribute of <f:ajax>
instead.
<f:ajax listener="#{bean.actionSearch}" />
This will be executed during Invoke Action phase, after Update Model Values phase.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With