Ключ заключается в использовании атрибута рендеринга для отображения / скрытия компонентов, так что только один или другой фактически обновляет модель за раз. Вот очень простой пример для иллюстрации:
<h:form id="exampleForm" prependId="false">
<h:inputText id="test1" value="#{exampleBean.testString}" rendered="#{exampleBean.toggle}" style="border: 1px solid red;" />
<h:inputText id="test2" value="#{exampleBean.testString}" rendered="#{!exampleBean.toggle}" style="border: 1px solid blue;" />
<h:commandButton id="testButton" action="#{exampleBean.toggle()}" />
</h:form>
и пример компонента с общим свойством testString
:
@ManagedBean(name = "exampleBean")
@ViewScoped
public class ExampleBean {
private String testString;
public String getTestString() { return testString; }
public void setTestString(String testString) {
this.testString = testString;
System.out.println(testString);
}
private boolean toggle;
public boolean isToggle() { return toggle; }
public void setToggle(boolean toggle) { this.toggle = toggle; }
public void toggle() {
toggle = (toggle) ? false : true;
}
}