Submitting values of conditionally rendered inputfields
jensmander Sep 9, 2010 9:27 AMHi,
I'd like to show some fields of my form only in specific situations. It depends on the selected values of a combobox. To set up the conditional behavior of the inputtext-element I use the rendered-attribute and to reRender the inputtext-element I specified a a4j:support-element within the combobox which invokes the rerender process if the combobox changes it's values. The problem is that if I do it like that page never transfers the values of the inputtext into the defined BackingBean attribute or in other words the setInputtext method will never be invoked.
Take a look at this JSF-Code
<!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">
<body>
<ui:composition template="/templates/popup.xhtml">
<ui:define name="pageTitle">Test</ui:define>
<ui:define name="pageHeader">Testform</ui:define>
<ui:define name="body">
<h:form id="frmTest">
<h:panelGrid columns="2">
<h:outputLabel value="Choice" />
<rich:comboBox value="#{testBean.value}">
<f:selectItems value="#{testBean.values}" />
<a4j:support event="onchange" reRender="frmTest" />
</rich:comboBox>
<h:outputLabel for="txtInput" value="Inputtext" />
<h:inputText id="txtInput" value="#{testBean.inputText}" rendered="#{testBean.visible}"/>
<h:commandButton value="Submit" />
</h:panelGrid>
</h:form>
</ui:define>
</ui:composition>
</body>
</html>
The backing bean is set to request scope and looks like that
package de.hd.kiwi.backingBean;
import java.util.ArrayList;
import java.util.List;
import javax.faces.model.SelectItem;
public class TestBean {
private String choice;
private String inputText;
public boolean isVisible() {
return choice != null && (choice.equals("Choice 2") || choice.equals("Choice 4"));
}
public List<SelectItem> getValues() {
List<SelectItem> res = new ArrayList<SelectItem>();
for (int i =0; i< 5;++i) {
res.add(new SelectItem("Choice " + i));
}
return res;
}
public void setValue(String s) {
choice = s;
}
public String getValue() {
return choice;
}
public String getInputText() {
return inputText;
}
public void setInputText(String input) {
System.out.println("Inputtext: " + input);
this.inputText = input;
}
}
May anybody tell me why this problems occures? The submit-button should invoke all the setters of the BackingBean I guess so why it doesn't? Is there a missmatch of the client and server-side? I hope somebody can tell me how to fix it. Thanks a lot.
Jens