java - example - primefaces showcase
Iterar sobre HashMap.values () en JSF+Facelets (1)
Bueno, como resultado, no se puede usar cualquier tipo de tipo de colección con dataTable, y por una buena razón. Desde la especificación MyFaces 1.2 , el atributo de valor debe ser:
Una expresión EL que especifica el modelo de datos que respalda esta tabla.
El valor al que hace referencia la expresión EL puede ser de cualquier tipo.
- Un valor de tipo DataModel se usa directamente.
- Los parámetros del tipo
Object[]
,java.util.List
,java.sql.ResultSet
ojavax.servlet.jsp.jstl.sql.Result
se envuelven en un DataModelt correspondiente que sabe cómo iterar sobre los elementos.- Otros valores se envuelven en un modelo de datos como una sola fila.
Tenga en cuenta en particular que las colecciones desordenadas, por ejemplo,
Set
no son compatibles. Por lo tanto, si la expresión de valor hace referencia a dicho objeto, se considerará que la tabla contiene solo un elemento: la colección en sí misma.
La colección devuelta desde HashSet.values () no está ordenada y, por lo tanto, no es compatible. Si lo fuera, no tendrías idea del orden en que se generarían las filas en tu tabla, y las actualizaciones de la página podrían reordenarlas al azar. No está bien.
El error que está obteniendo es que, desde el último párrafo, dice que la tabla de datos está tratando su Colección como el objeto de la fila, y la Colección no tiene una propiedad de "nombre".
Estoy usando JSF / Facelets, y estoy tratando de iterar sobre algunos objetos de documento (objeto personalizado) que guardo en un HashMap. Cuando se carga la página, obtengo el error "Propiedad ''nombre'' no encontrado en tipo java.util.HashMap $ Valores". Esto es lo que hay en mi bean de respaldo:
private Map<String, Document> documents = new HashMap<String, Document>();
public Collection<Document> getDocuments(){
return documents.values();
}
Y en mi página xhtml:
<h:dataTable id="documentTable"
value="#{DocumentManager.allDocuments}"
var="doc" rowClasses="list-row-odd, list-row-even"
headerClass="table-header" styleClass="bordered">
<h:column id="col_name">
<f:facet name="header">Name</f:facet>
${doc.name}
</h:column>
</h:dataTable>
Si cambio la función getDocuments a lo siguiente, funciona (es decir, la tabla se muestra sin error), pero no estoy seguro de por qué tengo que poner los valores en la lista para que la página JSF / Facelets se muestre correctamente.
public List<Document> getDocuments(){
List<Document> rtrn = new ArrayList<Document>();
for(Document doc : documents.values())
rtrn.add(doc);
return rtrn;
}
¿No debería ser capaz de iterar sobre la colección?