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 :

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, @Controller Spring 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>

Références