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?