Filtering h:selectOneMenu using a4j:support - Java Code
m_w_abdo Jun 28, 2009 4:16 AMDears,
I have two selectOneMenu(s) country and city. When the User select one country the city combo box should be loaded with corresponding cities in that country.
Noticing that I am using Richfaces 3.1.6 (JSF 1.1) and Java code to build my screen at runtime. The following are my source files:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@ page contentType="text/html;charset=windows-1252"%> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> <%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%> <%@ taglib uri="http://richfaces.org/rich" prefix="rich"%> <f:view> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"/> <title>untitled1</title> </head> <body> <a4j:form ajaxSubmit="true"> <h:panelGrid binding="#{bean.htmlPanelGrid}" /> </a4j:submit> </body> </html> </f:view>
The following my Bean
package comboboxes; import java.util.HashMap; import java.util.Map; import javax.faces.component.UIComponent; import javax.faces.component.UISelectItems; import javax.faces.component.html.HtmlPanelGrid; import javax.faces.component.html.HtmlSelectOneMenu; import javax.faces.context.FacesContext; import javax.faces.el.ValueBinding; import javax.faces.event.ActionEvent; import org.ajax4jsf.component.html.AjaxForm; import org.ajax4jsf.component.html.HtmlAjaxSupport; public class Bean { private HtmlPanelGrid htmlPanelGrid; private HtmlSelectOneMenu country; private HtmlSelectOneMenu city; public Bean() { this.htmlPanelGrid = new HtmlPanelGrid(); this.country = new HtmlSelectOneMenu(); this.country.setId("countryId"); this.populate(country); this.city = new HtmlSelectOneMenu(); this.city.setId("cityId"); this.populate(city); this.addOnChange(country, "cityId"); this.getHtmlPanelGrid().getChildren().add(country); this.getHtmlPanelGrid().getChildren().add(city); } public void addOnChange(UIComponent component, String reRender) { HtmlAjaxSupport htmlAjaxSupport = new HtmlAjaxSupport(); htmlAjaxSupport.setId("htmlAjaxSupportId"); htmlAjaxSupport.setEvent("onchange"); htmlAjaxSupport.setReRender(component.getParent().getId() + ":" + reRender); htmlAjaxSupport.setActionListener(FacesContext.getCurrentInstance().getApplication().createMethodBinding( "#{bean.loadCombo}", new Class[] {ActionEvent.class})); component.getChildren().add(htmlAjaxSupport); } public void loadCombo(ActionEvent e) { this.city.setValue("Paris"); } public void populate(UIComponent component) { Map map = new HashMap(); map.put("France", "Paris"); map.put("England", "London"); FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("map", map); ValueBinding valueBinding = FacesContext.getCurrentInstance().getApplication().createValueBinding("#{sessionScope.map}"); UISelectItems selectItems = new UISelectItems(); selectItems.setValueBinding("value", valueBinding); component.getChildren().add(selectItems); } public void setHtmlPanelGrid(HtmlPanelGrid htmlPanelGrid) { this.htmlPanelGrid = htmlPanelGrid; } public HtmlPanelGrid getHtmlPanelGrid() { return htmlPanelGrid; } }
The problem here is, the ActionListener is executed but the city combo box is not refreshing. I believe the HtmlAjaxSupport is not working porperly.
do you have any idea?