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

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.

 
 

¿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.

 
 
   
 

¿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?

Modelo (Fila):

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

DAO:

 public List list() throws SQLException { Connection connection = null; Statement statement = null; ResultSet resultSet = null; List rows = new ArrayList(); 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 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):

   ...  Error: ${error} 

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.

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}

Tu no

En primer lugar, colocar SQL en JSP, incluso mediante tags, 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 el código Java que el código JSP más adelante si es necesario hacerlo (es mucho más simple probar Java código también).