Je sais que cette question est déjà marquée comme résolue mais je veux ajouter une image plus récente expliquant ce modèle en détail (source : spring in action 4) :
Explication
Lorsque la demande quitte le navigateur (1) il contient des informations sur ce que l'utilisateur demande. Au minimum, la requête transporte l'URL demandée. Mais elle peut aussi transporter des données supplémentaires, comme les informations soumises dans un formulaire par l'utilisateur.
Le premier arrêt dans le voyage de la requête est le DispatcherServlet de Spring. Comme la plupart des frameworks web basés sur Java, Spring MVC fait transiter les requêtes par un seul servlet contrôleur frontal. Un contrôleur frontal est un modèle d'application web courant dans lequel une servlet unique délègue la responsabilité d'une requête à d'autres composants de l'application pour effectuer le traitement réel. Dans le cas de Spring MVC, DispatcherServlet est le contrôleur frontal. Le travail du DispatcherServlet est d'envoyer la requête à un contrôleur Spring MVC. Un contrôleur est un composant Spring qui traite la requête. Mais une application typique peut avoir plusieurs contrôleurs, et DispatcherServlet a besoin d'aide pour décider à quel contrôleur envoyer la requête. Ainsi, le DispatcherServlet consulte un ou plusieurs mappages de gestionnaire (2) pour savoir où sera le prochain arrêt de la requête. Le mappage du gestionnaire accorde une attention particulière à l'URL transportée par la requête lorsqu'il prend sa décision. Une fois qu'un contrôleur approprié a été choisi, le DispatcherServlet envoie la demande au contrôleur choisi. (3) . Au niveau du contrôleur, la demande dépose sa charge utile (les informations soumises par l'utilisateur) et attend patiemment que le contrôleur traite ces informations. (En fait, un contrôleur bien conçu ne réalise que peu ou pas de traitement lui-même et délègue plutôt la responsabilité de la logique métier à un ou plusieurs objets de service). La logique exécutée par un contrôleur donne souvent lieu à des informations qui doivent être transmises à l'utilisateur et affichées dans le navigateur. Ces informations sont appelées le modèle. Mais renvoyer des informations brutes à l'utilisateur n'est pas suffisant - elles doivent être formatées dans un format convivial, typiquement HTML. Pour cela, les informations doivent être transmises à une vue, généralement une page JavaServer (JSP). L'une des dernières choses que fait un contrôleur est d'emballer les données du modèle et d'identifier le nom de la vue qui doit rendre la sortie. Il renvoie ensuite la requête, ainsi que le nom du modèle et de la vue, au DispatcherServlet. (4) . Pour que le contrôleur ne soit pas couplé à une vue particulière, le nom de la vue renvoyé à DispatcherServlet n'identifie pas directement un JSP spécifique. Il ne suggère même pas nécessairement que la vue est une JSP. Au lieu de cela, il porte seulement un nom logique qui sera utilisé pour rechercher la vue réelle qui produira le résultat. Le DispatcherServlet consulte un résolveur de vues. (5) pour faire correspondre le nom logique de la vue à une implémentation spécifique de la vue, qui peut être ou non un JSP. Maintenant que le DispatcherServlet sait quelle vue rendra le résultat, le travail de la requête est presque terminé. Son dernier arrêt est l'implémentation de la vue (6) La requête est envoyée au serveur, généralement un JSP, où elle fournit les données du modèle. Le travail de la requête est enfin terminé. La vue utilisera les données du modèle pour produire un résultat qui sera renvoyé au client par l'objet de réponse (pas si laborieux). (7) .