Estoy tratando de escribir un panel de control de seguridad que muestra el estado de la copia de seguridad de múltiples servidores. La idea es mostrar una tabla con JSP que tenga las fechas de los últimos días en las columnas y los nombres de los servidores en filas. En la mesa de este pobre, escribí los valores Sí/No.Iterar un Multimap con JSP
+------------+------------+------------+------------+
+ Host Name | 2011-06-10 | 2011-06-09 | 2011-06-08 |
+------------+------------+------------+------------+
| web01 | Y | Y | N |
+------------+------------+------------+------------+
| web02 | Y | Y | Y |
+------------+------------+------------+------------+
Cada servidor, hace su propia copia de seguridad y guarda el estado en Amazon SimpleDB y yo escribimos un método Java para recuperar esta información de los últimos días con la firma siguiente:
/**
* List MySQL backups of the last howManyDays days. It starts from today
* included at index 0 and goes back in the past until we have a list of
* howManyDays days, even if some day doesn't have any data. Return a list of
* dates, each of which contains a list of backup jobs executed by servers in
* that day.
*
* @param howManyDays
* how many days of backup to show
* @return a Map where each key is the date in ISO format (2011-06-10) and each
* element is a backupJob which is represented by a Map where the key is
* the server name (ex. web01, web01) and the value is "Y" if all was
* fine, otherwise it contains the error message.
*/
public Multimap<String, Map<String, String>> listMysqlBackups(int howManyDays);
Multimapa es Google Guava Multimap porque tengo varias copias de seguridad por día. Ejemplo de salida:
{2011-06-10=[{web06=Y}, {web05=Y}], 2011-06-08=[{web05=Y}, {web06=Y}],
2011-06-09=[{web05=Y}, {web06=Y}], 2011-06-07=[{web05=Y}, {web06=Y}]}
No sé cómo consumir esta información en JSP. Probé con foreach:
<c:forEach items="${backups}" var="backup" varStatus="backupId">
${backup.key}
</c:forEach>
y la respuesta fue:
javax.servlet.ServletException: javax.servlet.jsp.JspTagException: Don't know
how to iterate over supplied "items" in <forEach>
Ahora estoy pensando si estoy pegarme un tiro en el pie con un valor de retorno demasiado complejo y si debo lugar de retorno un ArrayList simple de HashMap donde cada HashMap contiene toda la información necesaria (fecha, nombre de host, mensaje). Si piensan que es un mejor enfoque, no tengo ningún problema para volver a escribir el método Java extrayendo los datos, pero ahora cada celda requerirá recorrer todo ArrayList para obtener el elemento (lo cual podría estar bien porque 6 servidores por 7 los días son solo 42 elementos).
¿Cómo abordaría este problema?
+1 para usar Table para representar una tabla. – Ray
Si utilizo las claves como dije date + hostname (ni siquiera necesito el guión bajo), puedo bajar para tener un simple Map y ya es suficiente, y no necesito bucle para obtener elementos. La tabla también parece interesante, pero ¿funciona JSP forEach en ella? De lo contrario, agregará complejidad, mientras que el propósito es reducir la complejidad. –
stivlo
Acepto su respuesta para la explicación útil y detallada, aunque decidí usar mi solución explicada a continuación porque tener solo un HashMap es más simple en lugar de tener que atravesar tres niveles. Gracias por tu ayuda. – stivlo