JSF 2 valueChangeListener example
When user make changes in input components, such as h:inputText or h:selectOneMenu, the JSF “value change event” will be fired.
Two ways to implement it :
1. Method binding – In input component, specified a bean’s method directly in the “valueChangeListener” attribute.
JSF…
<h:selectOneMenu value="#{bean.value}" onchange="submit()" valueChangeListener="#{bean.valueChangeMethod}"> <f:selectItems value="#{bean.values}" /> </h:selectOneMenu>
Java…
The method which interact with value change event should accept a ValueChangeEvent parameter.
@ManagedBean(name="bean") @SessionScoped public class BeanBean{ public void valueChangeMethod(ValueChangeEvent e){ //... } }
2. ValueChangeListener interface – In input component, add a “f:valueChangeListener” tag inside, and specified an implementation class of ValueChangeListener interface.
JSF…
<h:selectOneMenu value="#{bean.value}" onchange="submit()"> <f:valueChangeListener type="ValueListenerXXX" /> <f:selectItems value="#{bean.values}" /> </h:selectOneMenu>
Java…
Implements ValueChangeListener interface and override the processValueChange() method.
public class ValueListenerXXX implements ValueChangeListener{ @Override public void processValueChange(ValueChangeEvent event) throws AbortProcessingException { //... } }
To make it work, you have to attach a onchange=”submit()” JavaScript to the input component; Otherwise, no event will be fired.
Full valueChangeListener example
Here’s a JSF 2.0 application, with a dropdownbox (h:selectOneMenu) and a textbox (h:inputText), when user make changes in the dropdown box, it will fire the “value change event” and update the textbox with newly selected dropdown box value.
This example is demonstrate in both “Method binding” and “ValueChangeListener” way.
1. Method binding
A country bean to provide a list of the countries and locale code for demonstration. You can bind the bean’s method via “valueChangeListener” attribute in input component. See below :
CountryBean.java
package com.mkyong; import java.io.Serializable; import java.util.LinkedHashMap; import java.util.Map; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; import javax.faces.event.ValueChangeEvent; @ManagedBean(name="country") @SessionScoped public class CountryBean implements Serializable{ private static final long serialVersionUID = 1L; private static Map<String,String> countries; private String localeCode = "en"; //default value static{ countries = new LinkedHashMap<String,String>(); countries.put("United Kingdom", "en"); //label, value countries.put("French", "fr"); countries.put("German", "de"); countries.put("China", "zh_CN"); } public void countryLocaleCodeChanged(ValueChangeEvent e){ //assign new value to localeCode localeCode = e.getNewValue().toString(); } public Map<String,String> getCountryInMap() { return this.countries; } public String getLocaleCode() { return localeCode; } public void setLocaleCode(String localeCode) { this.localeCode = localeCode; } }
JSF page
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:ui="http://java.sun.com/jsf/facelets" > <h:body> <h1>JSF 2 valueChangeListener example</h1> <h:form> <h:panelGrid columns="2"> Selected country : <h:inputText id="country" value="#{country.localeCode}" size="20" /> Select a country {method binding}: <h:selectOneMenu value="#{country.localeCode}" onchange="submit()" valueChangeListener="#{country.countryLocaleCodeChanged}"> <f:selectItems value="#{country.countryInMap}" /> </h:selectOneMenu> </h:panelGrid> </h:form> </h:body> </html>
2. ValueChangeListener interface
Reuse above country bean to provide a list of the countries and locale code. Implements the ValueChangeListener interface and bind it via “f:valueChangeListener” tag. See below :
CountryValueListener.java
package com.mkyong; import javax.faces.context.FacesContext; import javax.faces.event.AbortProcessingException; import javax.faces.event.ValueChangeEvent; import javax.faces.event.ValueChangeListener; public class CountryValueListener implements ValueChangeListener{ @Override public void processValueChange(ValueChangeEvent event) throws AbortProcessingException { //access country bean directly CountryBean country = (CountryBean) FacesContext.getCurrentInstance(). getExternalContext().getSessionMap().get("country"); country.setLocaleCode(event.getNewValue().toString()); } }
JSF page
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:ui="http://java.sun.com/jsf/facelets" > <h:body> <h1>JSF 2 valueChangeListener example</h1> <h:form> <h:panelGrid columns="2"> Selected country : <h:inputText id="country" value="#{country.localeCode}" size="20" /> Select a country {ValueChangeListener class}: <h:selectOneMenu value="#{country.localeCode}" onchange="submit()"> <f:valueChangeListener type="com.mkyong.CountryValueListener" /> <f:selectItems value="#{country.countryInMap}" /> </h:selectOneMenu> </h:panelGrid> </h:form> </h:body> </html>
Demo
Default, country “United Kingdom” is selected.

If country dropdown box value is changed, fire valueChangeListener, and update the textbox value with newly selected dropdrow box value.








Sorry didn`t use the rules for codes in the right way!
The javax.el.PropertyNotFoundException has appeared…
in my case is:
And the method:
public void setContaAtiva(ValueChangeEvent event) {
Integer conta = (Integer) event.getNewValue();
ContaRN contaRN = new ContaRN();
this.contaAtiva = contaRN.carregar(conta);
}
But occours:
javax.el.PropertyNotFoundException: The class ‘financeiro.web.ContextoBean’ does not have the property ‘setContaAtiva’.
at javax.el.BeanELResolver.getBeanProperty(BeanELResolver.java:661)
at javax.el.BeanELResolver.getValue(BeanELResolver.java:290)
at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
at com.sun.el.parser.AstValue.getValue(AstValue.java:116)
…etc
I use this exact code, it’s great but has huge problem that I could not resolve.
lets just say I was in anther page where I have this for example ../faces/myotherpage.xhtml?cat=4 then I would go to my header where I have the drop down menu to change the language. Guess what happens? I see the page’s language changed yet the page Url becomes ../faces/myotherpage.xhtml which means it dropped cat=4 giving me null exception. Someone very expert told me to use on the dropdown menu so the page will be refreshed via ajax. Good work around but didn’t work for me for I have many ajax component that need to be refreshed not via ajax.. so how can this be resolved..
Thank you so much in advance for whom ever resolve this issue.
correction:
Someone very expert told me to use on the dropdown menu so the page will be refreshed via ajax entirely….
Hi,
In the above example, is it possible to do the same for more than 2 dropdowns? for e.g. if you have Country, State, City and High School as the dropdowns and change in any dropdown should reflect in all the dropdowns below a particular dropdown. For eg. change in country should refresh the state, city and school dropdowns. and change in state should refresh the city and the school dropdowns. I can make 2 dropdowns 2work but not all 4 as explained. PLEASE HELP AND REPLY ON MY EMAIL
Thanks for your example. You solved my problem
[...] JSF 2 valueChangeListener example When user make changes in input components, such as h:inputText or h:selectOneMenu, the JSF “value change event” will be fired. [...]