Architecture MVC
MVC (Model-View-Controller) est un patron d’architecture logicielle qui sépare une application en trois composants distincts, chacun ayant une responsabilité unique.
I. Les trois composants
1. Model
- Représente les données et la logique métier
- Accède à la source de données (BDD, API, fichiers…)
- Notifie la Vue des changements d’état (dans certaines implémentations)
- Indépendant de la Vue et du Contrôleur
Les classes pour les données et la logique métier en Java :
- POJO (Plain Old Java Object)/Entity
- DAO (Data Access Object)
- Service (contient la logique métier)
- Repository (collection d’objets)
2. View
- Représente la couche de présentation (ce que l’utilisateur voit)
- Affiche les données fournies par le Modèle
- Ne contient pas de logique métier
- Reçoit ses données via le Contrôleur
En Java Web : JSP, Thymeleaf, FreeMarker En frontend : Vue.js, React, HTML/CSS
3. Controller
- Fait office d’intermédiaire entre le Modèle et la Vue
- Reçoit les requêtes utilisateur (HTTP, événements…)
- Interroge/modifie le Modèle
- Choisit la Vue à afficher et lui transmet les données
En Java Web :
HttpServlet,@ControllerSpring MVC
II. Flux d’une requête HTTP
Utilisateur
│
│ Requête HTTP (GET /users)
▼
┌─────────────┐
│ Controller │ ← reçoit la requête
└──────┬──────┘
│ appelle
▼
┌─────────────┐
│ Service │ ← logique métier ┐
└──────┬──────┘ │
│ interroge │ = le "M" de MVC
▼ │
┌─────────────┐ │
│ Repository │ ← accès BDD │
└──────┬──────┘ │
│ retourne │
▼ │
┌─────────────┐ │
│ Model │ ← objet de données │
│ (Entity/ │ (User, Product…) │
│ POJO) │ ┘
└──────┬──────┘
│ remonte au Controller
▼
┌─────────────┐
│ Controller │ ← choisit la View, lui passe le Model
└──────┬──────┘
│ transmet
▼
┌─────────────┐
│ View │ ← affiche les données du Model
└──────┬──────┘
│ Réponse HTTP
▼
Utilisateur
La règle d’or à retenir : la View ne parle jamais directement au Model. Tout transite par le Controller.
III. Implémentation Java EE (Servlet/JSP)
Exemple concret — Pattern Front Controller
// Controller : une Servlet centrale
@WebServlet("/app/*")
public class FrontController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String path = req.getPathInfo(); // ex: /users/list
if ("/users/list".equals(path)) {
// Appel du Model (Service/DAO)
List<User> users = userService.findAll();
// Passage des données à la View
req.setAttribute("users", users);
// Dispatch vers la JSP (View)
req.getRequestDispatcher("/WEB-INF/views/users/list.jsp")
.forward(req, resp);
}
}
}<%-- View : list.jsp --%>
<c:forEach var="user" items="${users}">
<li>${user.username}</li>
</c:forEach>