Afficher les résultats JDBC en HTML dans la page JSP en utilisant MVC et DAO pattern
j'implémente MVC en utilisant JSP et JDBC. J'ai importé un fichier de classe de base de données dans mon fichier JSP et je voudrais montrer les données d'une table DB. Je ne sais pas comment retourner le ResultSet
de la classe Java à la page JSP et l'intégrer en HTML.
Comment puis-je y parvenir?
5 réponses
dans une approche MVC bien conçue, le fichier JSP ne doit pas contenir de ligne de code Java et la classe servlet ne doit pas contenir de ligne de code JDBC.
en Supposant que vous voulez afficher une liste de produits dans une boutique en ligne, le code suivant doit être créé.
-
Un
Product
classe représentant une entité du monde réel d'un produit, il doit être juste un 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. }
-
UN DAO de la classe qui fait tout le méchant JDBC travail et renvoie une belle
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; } }
-
a servlet classe qui obtient la liste et la place dans la portée de la requête.
@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); } } }
-
enfin un JSP fichier dans
/WEB-INF/products.jsp
qui utilise JSTL<c:forEach>
pour itérer au-dessus deList<Product>
qui est rendu disponible dans EL par${products}
, et utilise JSTL<c:out>
pour échapper aux propriétés de corde afin d'éviter XSS trous quand il s'agit de l'entrée contrôlée par l'utilisateur.<%@ 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>
pour le faire fonctionner, il suffit d'appeler le servlet par son URL. À condition que le servlet soit annoté @WebServlet("/products")
ou mappé en web.xml
avec <url-pattern>/products</url-pattern>
, alors vous pouvez l'appeler par http://example.com/contextname/products
voir aussi:
- Comment éviter le code Java dans les fichiers JSP?
- doGet et doPost dans les Servlets
- comment me connecter à la base de données / source de données JDBC dans une application basée sur servlet?
- Modèles de Conception basée sur le web applications
- RequestDispatcher.forward () vs HttpServletResponse.sendRedirect ()
- Comment mapper un ensemble de résultats avec un nombre inconnu de colonnes à une liste et l'afficher dans une table HTML?
- Comment passer l'article courant à la méthode Java en cliquant sur un lien hypertexte ou un bouton dans la page JSP?
MVC, dans un contexte d'application web, ne consiste pas à utiliser une classe d'un JSP. Elle consiste à utiliser le modèle suivant:
- le navigateur envoie une demande à un serveur web
- le serveur web est configuré de sorte que la requête soit traitée par un servlet ou un filtre (le contrôleur : code Java, pas le code JSP)
- le servlet/filtre envoie habituellement la requête à une classe spécifique (appelée Action, la partie du contrôleur), basé sur la configuration / annotations
- l'action exécute la logique commerciale (c'est-à-dire récupérer les données de la base de données dans votre exemple : le modèle)
- l'action transmet la demande à un JSP. Le rôle du JSP est uniquement de générer du code HTML (c'est-à-dire d'afficher vos données : la vue)
puisque le JSP utilise habituellement les tags JSP (le JSTL, par exemple) et le langage d'expression JSP, et depuis les tags JSP et les EL sont conçus pour obtenir des informations des JavaBeans, vous feriez mieux d'avoir vos données disponibles sous forme de JavaBeans ou de collections de JavaBeans.
le rôle du contrôleur (la classe action) est donc de récupérer les données, de créer des instances Javabéennes contenant les données, dans un format approprié pour le JSP, de les mettre dans les attributs request, puis de les envoyer au JSP. Le JSP va ensuite itérer les instances Javabéennes et afficher ce qu'elles contiennent.
vous ne devez pas mettre en œuvre le cadre MVC vous-même. Utilisez ceux qui existent déjà (rayures, entretoises, etc.)
Je ne sais pas comment retourner le résultat du fichier de classe à la page JSP
Eh bien, vous ne le faites pas.
le point de MVC est de séparer votre modèle ( le M DB info dans ce cas ) de votre point de vue ( V a jsp, dans ce cas ) de telle manière que vous pouvez changer la vue sans freinage à l'application.
à faire ceci vous pouvez utiliser un objet intermédiaire pour représenter vos données ( généralement appelé Dto - after Data Transfer Object -, ne sait pas comment ils l'appellent ces jours-ci ), et un autre objet pour les récupérer (généralement un DAO ).
donc en gros vous avez votre fichier JSP, vous obtenez les paramètres de la requête, puis vous invoquez une méthode à partir du DAO. Le dao, en interne a les moyens de se connecter à la base de données et de récupérer les données et construit une collection de DTO qui sont retournés au JSP pour le rendu.
quelque chose comme CE code extrêmement simplifié ( et peu sûr):
"151930920 de l'Employé".javaclass 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;
}
}
"151930920 de l'employé".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>
j'espère que cela vous donnera une meilleure idée.
Vous pouvez utiliser le <c:forEach >
tag
vous pouvez trouver un exemple détaillé dans le lien suivant exemple d'utilisation
je pense qu'il sera préférable pour vous de contenir les données de la table dans une collection telle que list et retourner la liste de la classe Java et réutiliser cette collection dans le JSP.