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?

47
demandé sur BalusC 2011-02-15 14:37:57

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 de List<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:

115
répondu BalusC 2018-05-13 08:41:30

MVC, dans un contexte d'application web, ne consiste pas à utiliser une classe d'un JSP. Elle consiste à utiliser le modèle suivant:

  1. le navigateur envoie une demande à un serveur web
  2. 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)
  3. 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
  4. 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)
  5. 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.)

11
répondu JB Nizet 2011-02-15 11:51:55

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é".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;
    }
}
"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.

5
répondu OscarRyz 2011-02-15 12:35:28

Vous pouvez utiliser le <c:forEach > tag

vous pouvez trouver un exemple détaillé dans le lien suivant exemple d'utilisation

-1
répondu Aba Dov 2011-02-15 12:18:56

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.

-1
répondu Sonoo Jaiswal 2012-05-10 19:04:57