Soy completamente nuevo en JSF, y simplemente intento una prueba de concepto para decidir si será útil para un proyecto. Mi POC simplemente consiste en una sola página, con una tabla, que contiene algunos datos.DataTable con columnas dinámicas
El número de columnas (así como el número de filas) es dinámico, cargado desde una base de datos antes de que se represente la página.
con la siguiente, consigo dos columnas estáticas con el número apropiado de filas, como yo esperaría:
<h:dataTable id="data" value="#{viewDataBean.dataRows}" var="row">
<h:column>
<f:facet name="header">
<h:outputText value="Col 1"/>
</f:facet>
<h:outputText value="#{row.values[0].value}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Col 2"/>
</f:facet>
<h:outputText value="#{row.values[1].value}"/>
</h:column>
</h:dataTable>
Lo que quería hacer era añadir un <c:forEach...>
en torno a un único conjunto de etiquetas <h:column>...</h:column>
, para repetir el número de columnas, pero eso no funcionó - he intentado una variedad de combinaciones, pero me esperaba algo como esto para trabajar:
<h:dataTable id="data" value="#{viewDataBean.dataRows}" var="row">
<c:forEach items="#{row.values}" var="val">
<h:column>
<f:facet name="header">
<h:outputText value="Col 1"/>
</f:facet>
<h:outputText value="#{val.value}"/>
</h:column>
</c:forEach>
</h:dataTable>
de buscar en Google, he leído varios comentarios vagos como 'esa no es la manera de hacerlo', pero No he podido encontrar ejemplos particularmente convincentes de la manera correcta. Alguien mencionó la construcción de la DataTable en el bean de respaldo, pero el único ejemplo de eso que pude encontrar fue http://forums.sun.com/thread.jspa?threadID=577589. Funcionó, pero se sintió un poco torpe, especialmente porque algunos de los métodos utilizados están en desuso.
Por el momento, parece poco probable que pueda utilizar otras bibliotecas distintas de JSF principal, pero eso podría cambiar si fuera absolutamente necesario. ¿Alguien puede arrojar alguna luz sobre el camino correcto para hacer esto? Parece que debería ser bastante simple, así que estoy seguro de que me falta algo obvio.