Bonjour ! Dans les leçons précédentes, nous avons assemblé les pièces maîtresses de la couche de présentation d'une application web Java : le contrôleur avec les Servlets, et la vue avec les JSP, la JSTL et l'Expression Language. Parallèlement, vous avez appris à construire une couche d'accès aux données robuste avec JDBC et le design pattern DAO.
Aujourd'hui, nous allons connecter ces deux mondes. L'objectif de cette leçon est de faire communiquer la couche de présentation (Servlet/JSP) avec la couche d'accès aux données (DAO). Vous apprendrez à faire en sorte que vos pages web affichent et manipulent des données qui ne sont plus statiques ou factices, mais qui proviennent d'une véritable base de données. C'est l'étape finale pour construire une application web dynamique et complète selon le modèle MVC.
1. Architecture Complète : MVC et DAO
Rappelons-nous du modèle MVC. Le Contrôleur (Servlet) reçoit la requête, la traite, fait appel au Modèle pour obtenir des données, puis les transmet à la Vue (JSP) pour affichage. Mais où se situe le DAO dans tout ça ?
Le DAO fait partie intégrante de la couche "Modèle". Il constitue la sous-couche d'accès aux données. L'idée est de séparer la logique métier (ex: la validation d'un formulaire) de la logique de persistance (ex: l'écriture en base de données).
Le flux complet d'une requête devient alors :
- Le client envoie une requête (ex: soumet un formulaire).
- Le Contrôleur (Servlet) intercepte la requête.
- Le Contrôleur appelle la logique métier (souvent une classe de service ou de formulaire) pour traiter les données.
- La logique métier appelle le DAO pour interagir avec la base de données (ex:
utilisateurDao.creer(utilisateur)). - Le DAO exécute la requête SQL via JDBC.
- Les données (ou un statut) remontent la chaîne jusqu'au Contrôleur.
- Le Contrôleur stocke les données/résultats dans la requête (
request.setAttribute). - Le Contrôleur transfère la requête à la Vue (JSP).
- La Vue affiche les données à l'utilisateur.
Le diagramme suivant illustre cette séparation des responsabilités.

Pour avoir une vision claire de l'organisation des fichiers dans un projet, l'image ci-dessous montre une structure typique.
2. Le point de connexion : la Servlet
La question cruciale est : comment une Servlet obtient-elle une instance du DAO pour pouvoir l'utiliser ?
Une mauvaise pratique serait de faire new ProduitDaoImpl() à chaque appel de doGet() ou doPost(). C'est inefficace et cela peut poser des problèmes de gestion des ressources, notamment des connexions à la base de données.
La solution professionnelle consiste à initialiser le DAO une seule fois et à le rendre disponible pour la Servlet. Pour cela, nous allons utiliser le cycle de vie de la Servlet.
Le cycle de vie d'une Servlet et la méthode init()
Une Servlet est instanciée par le conteneur (Tomcat) une seule fois : soit au démarrage de l'application, soit lors de la première requête qui lui est adressée. Juste après son instanciation, le conteneur appelle sa méthode init(). Cette méthode est donc l'endroit idéal pour effectuer des initialisations coûteuses qui ne doivent être faites qu'une seule fois.
La DAOFactory et le ServletContextListener
Pour découpler complètement notre code, nous ne voulons pas que la Servlet instancie directement une implémentation du DAO. On utilise pour cela le pattern Factory. De plus, cette DAOFactory elle-même doit être créée une seule fois pour toute l'application.
Le mécanisme standard en Java EE pour exécuter du code au démarrage de l'application est le ServletContextListener.
Le tutoriel de Zeste de Savoir explique ce processus de manière très détaillée. Je vous invite à le lire attentivement.
Le modèle DAO - Créez votre application web avec Java EE
Cet article de Zeste de Savoir est une référence sur le pattern DAO en Java EE. Il vous guidera pas à pas pour connecter proprement votre servlet à votre couche DAO.
Lisez la section "Intégration". Elle est divisée en plusieurs sous-parties. Chargement de la DAOFactory : Portez une attention particulière à la création du ServletContextListener (InitialisationDaoFactory). Comprenez son rôle : il est déclenché au démarrage de l'application, instancie la DAOFactory, et la stocke dans le ServletContext (la portée "application"). Utilisation depuis la servlet : Cette partie est cruciale. Analysez comment la servlet, dans sa méthode init(), récupère la DAOFactory depuis le ServletContext, puis l'utilise pour obtenir une instance du DAO (utilisateurDao). Cette instance est stockée dans une variable de la servlet, la rendant disponible pour doGet() et doPost(). Reprise de l'objet métier : Observez comment l'instance du DAO est passée à l'objet qui contient la logique métier (ici, InscriptionForm), généralement via son constructeur. C'est cet objet qui appellera ensuite les méthodes du DAO (comme creer()).
3. Mettre en œuvre le flux de données
Maintenant que la servlet a accès au DAO, voyons comment l'utiliser concrètement dans les méthodes doGet() et doPost().
La vidéo suivante est une démonstration complète et détaillée de l'architecture d'une application JEE, montrant explicitement comment le contrôleur (Servlet) dialogue avec la couche métier et la couche DAO.
Part 5 Bases de l'architecture JEE- Servlet JSP MVC JDBC ORM
Cette vidéo du Professeur Mohamed Youssfi, bien que dense, détaille l'interaction entre les différentes couches de notre application. Elle vous montrera concrètement le code qui relie la servlet au DAO.
Regardez attentivement la section sur le rôle du contrôleur. Concentrez-vous sur les points suivants : Déclaration et initialisation du DAO (métier) dans la méthode init() de la servlet. Dans la méthode doGet(), comment le contrôleur récupère les paramètres de la requête. L'appel à la méthode du DAO (métier.produitParMotCle(...)). La création d'un modèle (ProduitModele) pour stocker les données à afficher. Le stockage du modèle dans la requête avec request.setAttribute("modele", modele). Le transfert (forward) vers la JSP pour l'affichage.
Pour compléter, la vidéo ci-dessous offre une perspective un peu différente mais tout aussi pertinente, en se concentrant sur l'initialisation et l'utilisation abstraite du DAO via son interface.
Développez des sites web avec Java EE: Utiliser le modèle DAO
Cette vidéo de Cours informatique-G se focalise sur l'intégration du pattern DAO dans une servlet.
Regardez la section montrant l'intégration dans la servlet. Notez bien comment : La méthode init() est utilisée pour charger la DAOFactory et obtenir une instance du DAO. La servlet stocke une référence à l'interface UtilisateurDAO, et non à son implémentation UtilisateurDaoImpl. C'est un point clé du découplage. Les méthodes doGet et doPost appellent ensuite les méthodes de l'interface (utilisateurDao.lister(), utilisateurDao.ajouter(...)) sans se soucier de l'implémentation sous-jacente.
4. Exemple de flux complet : Un formulaire de connexion
Pour synthétiser, regardons un exemple de code complet pour un formulaire de connexion, qui illustre parfaitement l'interaction entre toutes les couches.
-
login.jsp(La Vue)- Un formulaire HTML simple avec des champs
loginetpassword. - Il soumet les données en
POSTà la servlet/login. - Il peut afficher un message d'erreur via l'Expression Language :
${errorMessage}.
(Voirlogin.jspdans la ressource LINK, section 5)
- Un formulaire HTML simple avec des champs
-
Login.java(Le Contrôleur)doPost()est exécutée.- Elle récupère
loginetpasswordde la requête (request.getParameter(...)). - Elle appelle la couche d'accès aux données :
User user = UserDAO.checkLogin(login, password);. - Si
usern'est pasnull(connexion réussie) :- L'objet
userest stocké dans la session :session.setAttribute("connectedUser", user);. - La requête est transférée (forward) vers une page de succès, par exemple
viewArticle.jsp.
- L'objet
- Si
userestnull(échec de la connexion) :- Un message d'erreur est placé dans la requête :
request.setAttribute("errorMessage", "Bad identity");. - La requête est transférée de nouveau vers
login.jsppour afficher l'erreur.
(VoirLogin.javadans la ressource LINK, section 3)
- Un message d'erreur est placé dans la requête :
-
UserDAO.java(La couche d'accès aux données)- Contient une méthode statique
checkLogin(String login, String password). - Cette méthode se connecte à la base de données.
- Elle utilise un
PreparedStatementpour exécuter une requêteSELECTsécurisée et rechercher l'utilisateur. - Si un utilisateur est trouvé, elle crée et retourne un objet
User. - Sinon, elle retourne
null.
(VoirUserDAO.javadans la ressource LINK, section 0)
- Contient une méthode statique
Ce simple exemple de connexion encapsule tout le flux que nous avons étudié. La vue est découplée du contrôleur, et le contrôleur est découplé de la base de données grâce au DAO.
Conclusion
Félicitations ! Vous avez maintenant assemblé toutes les pièces du puzzle d'une application web Java EE basée sur le modèle MVC. Vous êtes capable de créer une application où la couche de présentation (Servlets et JSP) dialogue de manière propre et sécurisée avec la couche de persistance (JDBC et DAO) pour manipuler des données réelles.
Points clés à retenir :
- L'architecture complète d'une application web Java EE sépare clairement la Présentation (Vue/Contrôleur), la Logique Métier et l'Accès aux Données (DAO).
- La méthode
init()d'une servlet est l'endroit idéal pour initialiser des ressources coûteuses comme une instance de DAO, qui sera ensuite partagée par toutes les requêtes. - Un
ServletContextListenerest utilisé pour initialiser des ressources à l'échelle de l'application, comme uneDAOFactory, au démarrage du serveur. - La servlet orchestre le flux : elle reçoit les requêtes, appelle le DAO (souvent via une couche métier), place les résultats dans une portée (
requestousession), et délègue l'affichage à une JSP. - La communication entre la servlet et le DAO doit se faire via des interfaces pour garantir un couplage faible et une meilleure maintenabilité.
Dans la prochaine leçon, qui sera un projet pratique, vous allez mettre en œuvre tout ce que vous avez appris dans ce module pour construire une application web CRUD (Create, Read, Update, Delete) complète de A à Z. Ce sera l'occasion de consolider vos compétences et de voir comment tous ces concepts s'articulent dans un projet concret.