java jsp jdbc jstl

¿Cómo puedo hacer que un ResultSet de Java esté disponible en mi jsp?



jstl java api download (4)

Si está utilizando un marco web como Spring mvn o struts, tiene una clase de controlador que se ejecuta antes de la jsp real. Esto puede tener un método

ResultSet getResult()

Este método estará disponible como $ {result} dentro de su jsp.

Si no está utilizando ninguno de estos frameworks, aún puede usar jsp usebean y vincular un javaclass a una variable (consulte la documentación de usebean). Si usa beans en una variable de myBean, accede a ella con $ {myBean.result}

Por último, también puede vincular el resultado a los parámetros de solicitud "en otro lugar". En este caso, dirígelo como $ {param.result}

Esta pregunta ya tiene una respuesta aquí:

Me gustaría cambiar una consulta sql: por algún código Java que cree una consulta compleja con varios parámetros. El sql actual es una selección simple.

<sql:query var="result" dataSource="${dSource}" sql="select * from TABLE "> </sql:query>

¿Cómo tomo mi Java ResultSet (es decir, rs = stmt.executeQuery (sql);) y pongo los resultados a disposición en mi JSP para poder hacer este libro de texto JSP?

Para ser más claro, quiero eliminar la consulta anterior y reemplazarla con Java.

<% ResultSet rs = stmt.executeQuery(sql); // Messy code will be in some Controller %>

<c:forEach var="row" items="${result.rows}"> <c:out value="${row.name}"/> </c:forEach>

¿Configuro la variable de sesión / página en la sección de Java o hay algún truco de EL que puedo usar para acceder a la variable?


Tu no

En primer lugar, colocar SQL en JSP, incluso mediante etiquetas, es indicativo de una opción de diseño horrible. La página JSP es la "vista" en el patrón de controlador de vista de modelo. Su trabajo es mostrar su modelo, no hacer nada con él aparte de mostrarlo.

En su clase de controlador, ejecute su SQL y recupere los objetos reales de Java que se pueden visualizar a través del JSP. Luego, en su JSP, muéstrelos. Deje su SQL a su controlador, y deje que JSP se concentre simplemente en mostrar los datos. No solo obtiene una clara separación de preocupaciones, sino que su JSP se vuelve mucho más simple como resultado, y es mucho más fácil refactorizar código Java que código JSP más adelante si es necesario hacerlo (es mucho más simple probar Java código también).


Configura un atributo de sesión / solicitud del código de Java.

Sin embargo, sugeriría no utilizar un ResultSet, ya que tiene algunos problemas de ciclo de vida (es decir, debe cerrarse). Sugiero buscar el objeto ResultSet en el código Java, iterar sobre él, crear una lista, cerrar el ResultSet y pasar la lista al JSP.

Si está utilizando Spring, las JdbcTemplates proporcionan métodos que toman una cadena SQL y parámetros y devuelven una Lista> con los resultados de la consulta, lo que puede ser muy útil para esto.


Modelo (Fila):

public class Row { private String name; // Add/generate constructor(s), getters and setters. }

DAO:

public List<Row> list() throws SQLException { Connection connection = null; Statement statement = null; ResultSet resultSet = null; List<Row> rows = new ArrayList<Row>(); try { connection = database.getConnection(); statement = connection.createStatement(); resultSet = statement.executeQuery(SQL_LIST); while (resultSet.next()) { Row row = new Row(); row.setName(resultSet.getString("name")); // ... rows.add(row); } } finally { if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {} if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {} if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {} } return rows; }

Controlador (servlet):

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { List<Row> rows = someDAO.list(); request.setAttribute("rows", rows); } catch (SQLException e) { request.setAttribute("error", "Retrieving rows failed."); e.printStackTrace(); } request.getRequestDispatcher("page.jsp").forward(request, response); }

Ver (page.jsp):

<c:forEach items="${rows}" var="row"> <c:out value="${row.name}" /> ... </c:forEach> <c:if test="${not empty error}">Error: ${error}</c:if>