java - ejemplos - crud spring mvc netbeans
Mostrar JDBC ResultSet en HTML en la página JSP usando el patrón MVC y DAO (5)
Estoy implementando MVC usando JSP y JDBC. He importado un archivo de clase de base de datos a mi archivo JSP y me gustaría mostrar los datos de una tabla DB. No sé cómo debería devolver el ResultSet
de la clase Java a la página JSP e incrustarlo en HTML.
¿Cómo puedo conseguir esto?
Creo que será mejor para usted contener los datos de la tabla en una colección como lista y devolver la lista de la clase Java y reutilizar esta colección en el JSP.
En un enfoque MVC bien diseñado, el archivo JSP no debe contener ninguna línea de código Java y la clase de servlet no debe contener ninguna línea de código JDBC.
Suponiendo que desea mostrar una lista de productos en una tienda en línea, se debe crear el siguiente código.
Una clase de
Product
representa una entidad del mundo real de un producto, debe ser solo Javabean .public class Product { private Long id; private String name; private String description; private BigDecimal price; // Add/generate getters/setters/c''tors/equals/hashcode boilerplate. }
Una clase DAO que hace todo el desagradable trabajo de JDBC y devuelve una buena
List<Product>
.public class ProductDAO { private DataSource dataSource; public ProductDAO(DataSource dataSource) { this.dataSource = dataSource; } public List<Product> list() throws SQLException { List<Product> products = new ArrayList<Product>(); try ( Connection connection = dataSource.getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT id, name, description, price FROM product"); ResultSet resultSet = statement.executeQuery(); ) { while (resultSet.next()) { Product product = new Product(); product.setId(resultSet.getLong("id")); product.setName(resultSet.getString("name")); product.setDescription(resultSet.getString("description")); product.setPrice(resultSet.getBigDecimal("price")); products.add(product); } } return products; } }
Una clase de servlet que obtiene la lista y la coloca en el alcance de la solicitud.
@WebServlet("/products") public class ProductsServlet extends HttpServlet { @Resource(name="jdbc/YourDB") // For Tomcat, define as <Resource> in context.xml and declare as <resource-ref> in web.xml. private DataSource dataSource; private ProductDAO productDAO; @Override public void init() { productDAO = new ProductDAO(dataSource); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { List<Product> products = productDAO.list(); request.setAttribute("products", products); // Will be available as ${products} in JSP request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response); } catch (SQLException e) { throw new ServletException("Cannot obtain products from DB", e); } } }
Finalmente un archivo JSP en
/WEB-INF/products.jsp
que usa JSTL<c:forEach>
para iterar sobreList<Product>
que está disponible en EL por${products}
, y usa JSTL<c:out>
para escapar propiedades de cadena para evitar agujeros XSS cuando se trata de entrada controlada por el usuario.<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/format" prefix="fmt" %> ... <table> <c:forEach items="${products}" var="product"> <tr> <td>${product.id}</td> <td><c:out value="${product.name}" /></td> <td><c:out value="${product.description}" /></td> <td><fmt:formatNumber value="${product.price}" type="currency" currencyCode="USD" /></td> </tr> </c:forEach> </table>
Para que funcione, simplemente llame al servlet por su URL. Siempre que el servlet esté anotado @WebServlet("/products")
o mapeado en web.xml
con <url-pattern>/products</url-pattern>
, puede llamarlo por http://example.com/contextname/products
Ver también:
- ¿Cómo evitar el código de Java en los archivos JSP?
- doGet y doPost en Servlets
- ¿Cómo debo conectarme a la base de datos / fuente de datos JDBC en una aplicación basada en servlet?
- Diseños de diseño de aplicaciones basadas en web
- RequestDispatcher.forward () frente a HttpServletResponse.sendRedirect ()
- ¿Cómo asignar un ResultSet con una cantidad desconocida de columnas a una lista y mostrarlo en una tabla HTML?
- ¿Cómo paso el elemento actual al método de Java haciendo clic en un hipervínculo o botón en la página JSP?
MVC, en un contexto de aplicación web, no consiste en utilizar una clase de un JSP. Consiste en usar el siguiente modelo:
- el navegador envía una solicitud a un servidor web
- el servidor web está configurado para que la solicitud sea manejada por un servlet o un filtro (el controlador: código Java, no código JSP)
- El servlet / filtro generalmente envía la solicitud a una clase específica (llamada Acción, la parte específica del controlador), en función de la configuración / anotaciones
- La acción ejecuta la lógica comercial (es decir, obtiene los datos de la base de datos en su ejemplo: el modelo)
- La acción reenvía la solicitud a un JSP. La función de JSP es solo generar código HTML (es decir, mostrar sus datos: la vista)
Dado que el JSP generalmente usa etiquetas JSP (el JSTL, por ejemplo) y el lenguaje de expresión JSP, y dado que las etiquetas JSP y EL están diseñadas para obtener información de JavaBeans, será mejor que tenga sus datos disponibles en forma de JavaBeans o colecciones. de JavaBeans.
El papel del controlador (la clase de acción) es, por lo tanto, obtener los datos, crear instancias de JavaBean que contienen los datos, en un formato adecuado para el JSP, ponerlos en atributos de solicitud y luego enviarlos al JSP. El JSP luego iterará a través de las instancias de JavaBean y mostrará lo que contienen.
No debe implementar el framework MVC usted mismo. Utilice los existentes (Stripes, Struts, etc.)
Puede usar la etiqueta <c:forEach >
Puede encontrar un ejemplo detallado en el siguiente ejemplo de uso de enlace
No sé cómo devolver el ResultSet del archivo de clase a la página JSP
Bueno, tu no.
El objetivo de MVC es separar su modelo (la información de M DB en este caso) de su vista ( V a jsp, en este caso) de tal forma que pueda cambiar la vista sin frenar a la aplicación.
Para hacer esto, puede usar un objeto intermedio para representar sus datos (generalmente llamado DTO - después del Objeto de Transferencia de Datos -, no sé cómo lo llaman en estos días), y otro objeto para buscarlo (generalmente un DAO).
Así que, básicamente, tiene su archivo JSP, obtiene los parámetros de solicitud y luego invoca un método de DAO. El dao, internamente tiene los medios para conectarse a la base de datos y obtener los datos y crea una colección de DTO que se devuelven al JSP para su renderizado.
Algo así como este código extremadamente simplificado (e inseguro):
Empleado.java
class Employee {
String name;
int emplid;
}
EmployeeDAO.java
class EmployeeDAO {
... method to connect
etc.
List<Employee> getAllNamed( String name ) {
String query = "SELECT name, emplid FROM employee where name like ?";
ResultSet rs = preparedStatement.executeQuery etc etc.
List<Employee> results = ....
while( rs.hasNext() ) {
results.add( new Employee( rs.getString("name"), rs.getInt("emplid")));
}
// close resources etc
return results;
}
}
employee.jsp
<%
request.setAttribute("employees", dao.getAllNamed( request.getParameter("name") );
%>
<table>
<c:forEach items="${employees}" var="employee">
<tr><td>${employee.emplid}</td><td>${employee.name}</td></tr>
</c:forEach>
</table>
Espero que esto te dé una mejor idea.