2012-02-08 14 views
10

He creado una aplicación de base de datos usando Netbeans, GlassFish y JavaDB. Ahora mi código de Servlet del controlador ejecuta algunas consultas SQL dinámicas y obtiene un Conjunto de resultados (o puedo cambiar a String). Ahora, ¿cómo puedo mostrar el conjunto de resultados devuelto en un formato tabular (no tengo idea acerca de la estructura del conjunto de resultados). ¿Alguien puede ayudarme con esto?Cómo asignar un ResultSet con una cantidad desconocida de columnas a una lista y mostrarlo en una tabla HTML?

+0

lo que problema tiene exactamente? obteniendo las filas del conjunto de resultados? generando una tabla HTML? muéstranos el código que tienes y dinos dónde estás atrapado. –

+0

@JB Nizet, tengo un código como, - createStatement(); resultset rs = st.executeQuery (consulta sql). Ahora me quedé atrapado aquí. Cómo mostrar este conjunto de resultados en una tabla HTML. Como no tengo idea acerca de la consulta, no tengo idea acerca de la estructura del conjunto de resultados. – alessandro

+0

@ BalusC, he visto su página de referencia. Pero, para aplicar product.setId (resultSet.getLong ("id")), tengo que saber cuántas columnas y qué tabla está devolviendo la declaración. No tengo idea de eso. – alessandro

Respuesta

33

Puede usar Map<String, Object> para representar una fila "dinámica", que es iterable en <c:forEach>. Puede usar ResultSetMetaData para recopilar información sobre las columnas, como column count y column labels.

Por lo tanto, esta asignación debe hacer:

List<Map<String, Object>> rows = new ArrayList<Map<String, Object>>(); 
ResultSetMetaData metaData = resultSet.getMetaData(); 
int columnCount = metaData.getColumnCount(); 

while (resultSet.next()) { 
    Map<String, Object> columns = new LinkedHashMap<String, Object>(); 

    for (int i = 1; i <= columnCount; i++) { 
     columns.put(metaData.getColumnLabel(i), resultSet.getObject(i)); 
    } 

    rows.add(columns); 
} 

para poder visualizarlo en JSP de la siguiente manera:

<table> 
    <thead> 
    <tr> 
     <c:forEach items="${rows[0]}" var="column"> 
     <td><c:out value="${column.key}" /></td> 
     </c:forEach> 
    </tr> 
    </thead> 
    <tbody> 
    <c:forEach items="${rows}" var="columns"> 
     <tr> 
     <c:forEach items="${columns}" var="column"> 
      <td><c:out value="${column.value}" /></td> 
     </c:forEach> 
     </tr> 
    </c:forEach> 
    </tbody> 
</table> 
+0

Gracias. Sin embargo, en la página JSP no puedo ver el conjunto de resultados. Lo que hice fue lo siguiente: request.setAttribute ("als", rows) en mi servlet y en JSP, rows = session.getAttribute ("als"); - ¿Falta algo? – alessandro

+0

Simplemente use '$ {als}'. No escriba código Java en el archivo JSP. Su error es por la forma en que trató de obtenerlo como una sesión attribtue en lugar de como un atributo de solicitud. Lea en http://stackoverflow.com/questions/3177733/how-to-avoid-java-code-in-jsp-files y http://stackoverflow.com/questions/3106452/how-do-servlets-work- instanciaiation-session-variables-and-multithreading – BalusC

+0

Lo siento pero añado Object rows = request.getAttribute ("$ {als}"). sin embargo, muestra filas variables no utilizadas. Y el problema sigue igual. – alessandro

3

Utilice los metadatos de resultados para saber el número de columnas devueltas por la consulta, el tipo de estas columnas, etc.

Ver the javadoc, que también tiene un ejemplo.

+0

Gracias. Es agradable. – alessandro

Cuestiones relacionadas