Основной подход должен был бы позволить атрибут таблиц rendered
зависят от выбранного пункта меню.
<p:selectOneMenu value="#{bean.table}">
<f:selectItem itemValue="players" itemLabel="Players" />
<f:selectItem itemValue="jobs" itemLabel="Jobs" />
<f:selectItem itemValue="business" itemLabel="Business" />
...
<p:ajax update="tables" />
</p:selectOneMenu>
<h:panelGroup id="tables">
<p:dataTable value="#{bean.players}" rendered="#{bean.table == 'players'}">
...
</p:dataTable>
<p:dataTable value="#{bean.jobs}" rendered="#{bean.table == 'jobs'}">
...
</p:dataTable>
<p:dataTable value="#{bean.business}" rendered="#{bean.table == 'business'}">
...
</p:dataTable>
...
</h:panelGroup>
Это легко осуществить, но вы в конечном итоге с большим количеством кода в представлении (который, конечно, может быть разделен более <ui:include>
файлов). Более продвинутый и многоразовый подход будет состоять в том, чтобы позволить value
отдельной таблицы зависеть от выбранного элемента меню и использовать <p:columns>
для динамического генерации столбцов.
<p:selectOneMenu value="#{bean.table}">
<f:selectItems value="#{bean.tables}" />
<p:ajax listener="#{bean.changeModel}" update="table" />
</p:selectOneMenu>
<p:dataTable id="table" value="#{bean.model}" var="item">
<p:columns value="#{bean.columns}" var="column">
<h:outputText value="#{item[column]}" />
</p:columns>
</p:dataTable>
что-то вроде:
public void changeModel() {
model = populateModelBasedOn(table);
columns = populateColumnsBasedOn(table);
}
Это позволяет только менее детализированный контроль всякий раз, когда вы хотите добавить более специализированных столбцов. Возможно, вам захочется работать с файлами тегов.
Какая правильная дата? Условный рендеринг является стандартным в jsf. –
Прошу прощения. Я новичок в JSF, поэтому не знал, как изменить видимость выбранного типа данных. –
Кстати, я обновил свой вопрос –