Bonjour,
Je choisis de travailler avec le design pattern DAO, c'est plus complexe que la "bidouille" en jdbc classique mais les possibilitées d'extention de bascule d'une base MySQL ou ORACLE ou autre est plus facile.
La rigueur imposée par cette technique rends l'encodage difficile mais offre un code plus ordonnée et malléable suivant les bases en exploitation.
j'ai choisis 4 java beans pour séparer le code mais c'est mieux organisé:
1/ Bean Daoexeption.java
2/DaoFactory.java qui gére la connection avec la base via le driver JDBC :Code:
1
2
3
4
5
6
7 package com.boticiel.dao; public class DaoException extends Exception { public DaoException(String message) { super(message); } }
3/ UtilisateurDao.java ou de décrit le nom des méthodes sans les implémenter :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 package com.boticiel.dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DaoFactory { private String url; private String username; private String password; DaoFactory(String url, String username, String password) { this.url = url; this.username = username; this.password = password; } public static DaoFactory getInstance() { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { } DaoFactory instance = new DaoFactory( "jdbc:mysql://localhost:3306/javaee", "root", ""); return instance; } public Connection getConnection() throws SQLException { Connection connexion = DriverManager.getConnection(url, username, password); connexion.setAutoCommit(false); return connexion; } // Récupération du Dao public UtilisateurDao getUtilisateurDao() { return new UtilisateurDaoImpl(this); } }
4/ UtilisateurDaoImpl.java ou j'implémente mes méthodes (ici j'ai pleins d'erreurs)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package com.boticiel.dao; import java.util.List; import com.boticiel.forms.Utilisateur; public interface UtilisateurDao { void ajouter( Utilisateur utilisateur ) throws DaoException; List<Utilisateur> lister() throws DaoException; void mise_a_jour( Utilisateur utilisateur ) throws DaoException; void supprimer( Utilisateur utilisateur ) throws DaoException; }
La servlet Db-Dao.java ou je pence avair fait un maivais chois d'encodage de la méthode Dopost() (ici j'ai pleins d'erreurs)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175 package com.boticiel.dao; import java.sql.*; import java.util.ArrayList; import java.util.List; import com.boticiel.forms.BeanException; import com.boticiel.forms.Utilisateur; public class UtilisateurDaoImpl implements UtilisateurDao { private DaoFactory daoFactory; public String operand; UtilisateurDaoImpl(DaoFactory daoFactory) { this.daoFactory = daoFactory; switch (operand) { case "ajouter": { public void ajouter(Utilisateur utilisateur) throws DaoException { Connection connexion = null; PreparedStatement preparedStatement = null; try { connexion = daoFactory.getConnection(); preparedStatement = connexion.prepareStatement("INSERT INTO noms(nom, prenom) VALUES(?, ?);"); preparedStatement.setString(1, utilisateur.getNom()); preparedStatement.setString(2, utilisateur.getPrenom()); preparedStatement.executeUpdate(); connexion.commit(); } catch (SQLException e) { try { if (connexion != null) { connexion.rollback(); } } catch (SQLException e2) { } throw new DaoException("Impossible de communiquer avec la base de données"); } finally { try { if (connexion != null) { connexion.close(); } } catch (SQLException e) { throw new DaoException("Impossible de communiquer avec la base de données"); } } } } } case "lister": { public List<Utilisateur> lister() throws DaoException { List<Utilisateur> utilisateurs = new ArrayList<Utilisateur>(); Connection connexion = null; Statement statement = null; ResultSet resultat = null; try { connexion = daoFactory.getConnection(); statement = connexion.createStatement(); resultat = statement.executeQuery("SELECT nom, prenom FROM noms;"); while (resultat.next()) { String id = resultat.getString("id"); String nom = resultat.getString("nom"); String prenom = resultat.getString("prenom"); Utilisateur utilisateur = new Utilisateur(); //utilisateur.setId(id); utilisateur.setNom(nom); utilisateur.setPrenom(prenom); utilisateurs.add(utilisateur); } } catch (SQLException e) { throw new DaoException("Impossible de communiquer avec la base de données"); } catch (BeanException e) { throw new DaoException("Les données de la base sont invalides"); } finally { try { if (connexion != null) { connexion.close(); } } catch (SQLException e) { throw new DaoException("Impossible de communiquer avec la base de données"); } } return utilisateurs; } } } case "mise_a_jour": { public void mise_a_jour(Utilisateur utilisateur) throws DaoException { Connection connexion = null; PreparedStatement preparedStatement = null; //String paramId = request.getParameter("id"); try { connexion = daoFactory.getConnection(); preparedStatement = connexion.prepareStatement("UPDATE noms SET nom = ?, prenom = ? WHERE id = ?"); preparedStatement.setString(1, utilisateur.getNom()); preparedStatement.setString(2, utilisateur.getPrenom()); preparedStatement.setInt(3, utilisateur.getId()); preparedStatement.executeUpdate(); connexion.commit(); } catch (SQLException e) { try { if (connexion != null) { connexion.rollback(); } } catch (SQLException e2) { } throw new DaoException("Impossible de communiquer avec la base de données"); } finally { try { if (connexion != null) { connexion.close(); } } catch (SQLException e) { throw new DaoException("Impossible de communiquer avec la base de données"); } } } } } case "supprimer": { public void supprimer(Utilisateur utilisateur) throws DaoException { Connection connexion = null; PreparedStatement preparedStatement = null; //String paramId = request.getParameter("id"); try { connexion = daoFactory.getConnection(); preparedStatement = connexion.prepareStatement("Delete * WHERE id = ?"); preparedStatement.executeUpdate(); connexion.commit(); } catch (SQLException e) { try { if (connexion != null) { connexion.rollback(); } } catch (SQLException e2) { } throw new DaoException("Impossible de communiquer avec la base de données"); } finally { try { if (connexion != null) { connexion.close(); } } catch (SQLException e) { throw new DaoException("Impossible de communiquer avec la base de données"); } } } }
5/ enfin la JSP ou je m'en sort bien ;Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115 package com.boticiel.servlets; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.boticiel.forms.Utilisateur; import com.boticiel.dao.*; @WebServlet("/Db_dao") public class Db_dao extends HttpServlet { private static final long serialVersionUID = 1L; private UtilisateurDao utilisateurDao; public void init() throws ServletException { DaoFactory daoFactory = DaoFactory.getInstance(); this.utilisateurDao = daoFactory.getUtilisateurDao(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { request.setAttribute("utilisateurs", utilisateurDao.lister()); } catch (DaoException e) { request.setAttribute("erreur", e.getMessage()); } this.getServletContext().getRequestDispatcher("/WEB-INF/db_dao.jsp").forward(request, response); } public void doPost( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { Utilisateur utilisateur = new Utilisateur(); public String operand; String operand = request.getParameter("operand"); switch (operand) { case "ajouter": { public void ajouter(Utilisateur utilisateurDao){ try { //utilisateur.setId( Integer.parseInt(paramId) ); utilisateur.setId(request.getParameter.toString(Integer.parseInt("id"))); utilisateur.setNom(request.getParameter("nom")); utilisateur.setPrenom(request.getParameter("prenom")); utilisateurDao.ajouter(utilisateur); request.setAttribute("utilisateurs", utilisateurDao.lister()); } catch (Exception e) { request.setAttribute("erreur", e.getMessage()); } this.getServletContext().getRequestDispatcher("/WEB-INF/db_dao.jsp").forward(request, response); } } case "lister": { public void lister(Utilisateur utilisateur){ try { request.setAttribute("utilisateurs", utilisateurDao.lister()); } catch (DaoException e) { request.setAttribute("erreur", e.getMessage()); } this.getServletContext().getRequestDispatcher("/WEB-INF/db_dao.jsp").forward(request, response); } } case "supprimer": { public void supprimer(Utilisateur utilisateur){ try { utilisateur.setId( Integer.parseInt(paramId) ); utilisateur.setId(request.getParameter.toString(Integer.parseInt("id"))); utilisateurDao.supprimer(utilisateur); request.setAttribute("utilisateurs", utilisateurDao.supprimer()); } catch (Exception e) { request.setAttribute("erreur", e.getMessage()); } this.getServletContext().getRequestDispatcher("/WEB-INF/db_dao.jsp").forward(request, response); } } case "mise_a_jour": { public void mise_a_jour(Utilisateur utilisateur){ try { utilisateur.setId( Integer.parseInt(paramId) ); utilisateur.setId(request.getParameter.toString(Integer.parseInt("id"))); utilisateur.setNom(request.getParameter("nom")); utilisateur.setPrenom(request.getParameter("prenom")); utilisateurDao.ajouter(utilisateur); request.setAttribute("utilisateurs", utilisateurDao.mise_a_jour()); } catch (Exception e) { request.setAttribute("erreur", e.getMessage()); } this.getServletContext().getRequestDispatcher("/WEB-INF/db_dao.jsp").forward(request, response); } } }
J'utilise un "CASE" pour différencier les 4 requête conventionnelles (select,update,insert,delete).Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>base de donnée DAO</title> </head> <body> base de donnée DAO <%@ include file="menu.jsp" %> <c:if test="${ !empty erreur }"><p style="color:red;"><c:out value="${ erreur }" /></p></c:if> <form method="post" action="db_dao"> <p> <label for="id">Index :</label> <input type="text" name="id" id="id" /> </p> <p> <label for="nom">Nom : </label> <input type="text" name="nom" id="nom" /> </p> <p> <label for="prenom">Prénom : </label> <input type="text" name="prenom" id="prenom" /> </p> <select id="operand" name="operand" > <option value="lister">lister</option> <option value="mise_a_jour">mise a jour</option> <option value="supprimer">supprimer</option> <option value="ajouter">ajouter</option> <input type="submit"name="Submit" value="db_dao"></p> </select> </form> <ul> <c:forEach var="utilisateur" items="${ utilisateurs }"> <li><c:out value="${ utilisateur.id }" /><c:out value="${ utilisateur.prenom }" /> <c:out value="${ utilisateur.nom }" /></li> </c:forEach> </ul> </html>
Si vous voulez m'aider je préfère du code source pour expliquer mes erreurs que des phrases peudo philosophique/technique, c'est important pour moi !
J'utilise aussi la JSTL pour contrer la faille XSS de Dotnet ASP.
Bonne lecture
Philippe