2010-06-01 99 views
15

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.

Respuesta

12

JSTL y JSF no se ejecutan sincronizados como cabría esperar de la codificación. Es más para que JSTL primero procese la página completa de arriba a abajo primero y luego entregue el resultado a JSF para su posterior procesamiento. El #{row} no está disponible en el momento en que JSTL está ocupado, por lo que su intento no funcionará.

El tema vinculado de hecho menciona métodos en desuso, pero el tema también está envejecido y analiza el JSF heredado 1.0/1.1. Si explora los Javadocs actuales de los métodos mencionados, verá que, como es habitual, se mencionan los métodos de reemplazo. Por ejemplo, Application#createValueBinding() menciona lo siguiente:

desuso. Esto ha sido reemplazado llamando al getExpressionFactory() y luego al ExpressionFactory.createValueExpression(javax.el.ELContext, java.lang.String, java.lang.Class).

Usted puede encontrar algunos ejemplos concretos de poblar dinámicamente una tabla de datos de esta manera en this article.

En cuanto a las bibliotecas de componentes de terceros, RichFaces tiene un componente rich:columns que está diseñado exactamente para este propósito.

0

La biblioteca de terceros PrimeFaces tiene el componente p:columns para generar columnas dinámicamente desde un origen de datos.

Cuestiones relacionadas