В JSF, h:dataTable
и h:panelGrid
оба создают HTML table
- теги.
Каково различие между обоими?
Когда использовать один или другой?
Как видно из названия, h: dataTable
используется в основном для отображения таблицы, содержащей данные из некоторых моделей вашего приложения. Вот пример использования.
<h:dataTable value="#{dataTableBean.items}" var="item">
<h:column>
<f:facet name="header" >
<h:outputText value="Item Category"/>
</f:facet>
<h:outputText value="#{item.category}"/>
</h:column>
</h:dataTable>
h: panelGrid
используется в основном для разметки и размещения элементов. Вот пример использования.
<h:panelGrid id="panel" columns="2" border="1">
<h:outputText value="First Name:" />
<h:inputText id="first" value="#{backingBean.user.firstName}" />
<h:outputText value="Last Name:" />
<h:inputText id="last" value="#{backingBean.user.lastName}" />
</h:panelGrid>
dataTable - это управляемый моделью компонент вывода данных . Для каждой строки в вашей модели компонент может устанавливать состояние своих дочерних элементов для каждой фазы жизненного цикла JSF . Такое поведение полезно или вредно в зависимости от того, чего вы пытаетесь достичь.
Напротив, panelGrid является просто элементом управления макетом .
Разница (очень) примерно аналогична разнице между JTable и JPanel .
Вы должны использовать panelGrid, когда знаете количество строк и столбцов, которые хотите отобразить, вы должны сами определить все дочерние компоненты (вручную, panelGrid не будет добавлять любые строки / столбцы сами по себе), а panelGrid их упорядочит. DataGrid, с другой стороны, используется, когда у вас есть структура данных (например, коллекция) с неопределенным размером, тогда вам просто нужно указать столбцы, которые вы хотите распечатать, и dataGrid будет перебирать эту коллекцию, создавая строку для каждой записи.