tabPanel: session scoped bean generates too many valueChange
richuserone Mar 17, 2009 2:35 PMIf my valueChange listener for a tabPanel is a session scoped bean, each time I revisit the page that contains the tabPanel a new valueChangeListener is added.
This causes the processValueChange method to be call for each valueChangeListener. I would expect that the processValueChange listener in my backing bean to be called only once.
My application requires that his bean be session scoped so changing the scope is not a viable option.
Thanks in advance!
The following code illustrates this:
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ValueChangeEvent;
import javax.faces.event.ValueChangeListener;
import org.richfaces.component.html.HtmlTabPanel;
//SESSION SCOPED BEAN
public class PanelTestBean implements ValueChangeListener {
private HtmlTabPanel tabs = new HtmlTabPanel();
public HtmlTabPanel getTabs() {
return tabs;
}
public void setTabs(HtmlTabPanel tabs) {
this.tabs = tabs;
System.out.println("Number of listeners: " + tabs.getValueChangeListeners().length);
}
public void processValueChange(ValueChangeEvent event) throws AbortProcessingException {
System.out.println("\nFire event:\nOld tab:" + event.getOldValue());
System.out.println("New tab:" + event.getNewValue());
}
public String getListenerCount() {
return "Number of listeners: " + getTabs().getValueChangeListeners().length;
}
}
<!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:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:rich="http://richfaces.org/rich"
xmlns:a4j="http://richfaces.org/a4j">
<ui:composition template="layout/layout.xhtml">
<ui:define name="title">Panel Test</ui:define>
<ui:define name="content">
<rich:tabPanel switchType="ajax" binding="#{panelTestBean.tabs}"
valueChangeListener="#{panelTestBean.processValueChange}"
id="panelTab">
<rich:tab label="Panel 1" id="P1">
<h:outputText value="#{panelTestBean.listenerCount}" />
</rich:tab>
<rich:tab id="P2" label="Panel 2">
<h:outputText value="#{panelTestBean.listenerCount}" />
</rich:tab>
<rich:tab id="P3" label="Panel 3">
<h:outputText value="#{panelTestBean.listenerCount}" />
</rich:tab>
</rich:tabPanel>
</ui:define>
</ui:composition>
</html>