226 votes

Qu'est-ce que le Dispatcher Servlet dans Spring ?

Dans cette image (que j'ai obtenue de aquí ), HTTP envoie quelque chose à Dispatcher Servlet.

enter image description here

Ma question est la suivante : que fait Dispatcher Servlet faire ?

Est-ce que c'est quelque chose comme obtenir l'information lancée depuis la page web et la lancer vers le contrôleur ?

232voto

Affe Points 24993

Le travail de l DispatcherServlet est de prendre un URI entrant et de trouver la bonne combinaison de gestionnaires (généralement des méthodes sur Contrôleur ) et des vues (généralement des JSP) qui se combinent pour former la page ou la ressource qui est censée se trouver à cet endroit.

Je pourrais avoir

  • un fichier /WEB-INF/jsp/pages/Home.jsp
  • et un méthode sur une classe

    @RequestMapping(value="/pages/Home.html")
    private ModelMap buildHome() {
        return somestuff;
    }

El Servlet répartiteur est la partie qui "sait" qu'il faut appeler cette méthode lorsqu'un navigateur demande la page, et combiner ses résultats avec le fichier JSP correspondant pour créer un document html.

La manière dont il accomplit cette tâche varie largement selon la configuration et la version de Spring.

Il n'y a pas non plus de raison que le résultat final doive être des pages web. Il peut faire la même chose pour localiser RMI les points d'arrivée, la poignée SOAP les requêtes, tout ce qui peut entrer dans une servlet.

4 votes

Excellente riposte, maintenant une question : comment se fait-il que le DispatcherServlet identifie le nom de la classe et le nom de la méthode aussi ? Pouvez-vous me montrer un exemple de configuration où j'ai deux classes et deux noms de méthode et comment le DispatcherServlet attrape la bonne requête.

13 votes

En fait, au démarrage, il recherche cette annotation dans le chemin de la classe et établit une correspondance entre "/pages/Home.html" et la classe + méthode. Si vous avez deux méthodes qui ont toutes deux "/pages/Home.html" sans aucune autre restriction dans leur annotation, ce sera une erreur et il vous enverra des exceptions. Si vous êtes de la vieille école, vous pouvez aussi le câbler avec du XML.

2 votes

Avons-nous besoin d'un Dispatcher Servlet xml lors de l'utilisation de l'Annotation Based @RestController ?

96voto

Dans Spring MVC, toutes les requêtes entrantes passent par un seul servlet. Ce servlet - DispatcherServlet - est le contrôleur frontal. Le contrôleur frontal est un modèle de conception typique dans le développement d'applications Web. Dans ce cas, une seule servlet reçoit toutes les demandes et les transfère à tous les autres composants de l'application.

La tâche de l DispatcherServlet est d'envoyer la demande au contrôleur Spring MVC spécifique.

Habituellement, nous avons beaucoup de contrôleurs et DispatcherServlet fait référence à l'un des mappeurs suivants afin de déterminer le contrôleur cible :

Si aucune configuration n'est effectuée, le DispatcherServlet utilise BeanNameUrlHandlerMapping y DefaultAnnotationHandlerMapping par défaut.

Lorsque le contrôleur cible est identifié, le DispatcherServlet lui envoie une demande. Le contrôleur effectue un travail en fonction de la requête (ou le délègue aux autres objets), et retourne à l'utilisateur. DispatcherServlet avec le modèle et le nom de la vue.

Le nom de la vue n'est qu'un nom logique. Ce nom logique est ensuite utilisé pour rechercher la vue réelle (pour éviter le couplage entre le contrôleur et la vue spécifique). Ensuite, DispatcherServlet fait référence à la ViewResolver et fait correspondre le nom logique de la vue à l'implémentation spécifique de la vue.

Quelques mises en œuvre possibles de la ViewResolver sont :

Lorsque le DispatcherServlet détermine la vue qui affichera les résultats ; elle sera rendue dans la réponse.

Enfin, le DispatcherServlet renvoie le Response au client.

83voto

user3044117 Points 1

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) :

enter image description here

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) .

0 votes

J'ai une question s'il vous plaît, comment il sélectionne la vue dans le cas du retour de l'objet JSON que nous voyons dans le navigateur, retourne-t-il à la même URI s'il n'y a pas de vue logique sélectionnée ?

2 votes

@Nesrin cela fait des années que tu as demandé mais voici une réponse : Tu mets une annotation spéciale juste au-dessus de l'élément @Controller méthode appelée @ResponseBody indiquant que la réponse renvoyée doit être écrite directement dans le corps de la réponse HTTP, sans être placée dans un modèle ou être résolue comme une vue quelconque.

51voto

skaffman Points 197885

DispatcherServlet est l'implémentation par Spring MVC de la méthode modèle de contrôleur frontal .

Voir la description dans les documents de Spring aquí .

Essentiellement, il s'agit d'une servlet qui prend la demande entrante et délègue le traitement de cette demande à l'un des nombreux gestionnaires, dont le mappage est spécifique dans le fichier de configuration de l'utilisateur. DispatcherServlet configuration.

0 votes

Est-ce que c'est quelque chose comme les événements dans Flex, où je reçois des événements de distribution d'un MXML à un autre ou à un serveur. Puis-je avoir plus d'un DispatcherServlet dans mon application ? Est-ce que chaque fichier de classe a un DispatcherServlet séparé ?

0 votes

Il n'y a généralement qu'un seul contrôleur frontal. Et ce, quels que soient les modèles et les vues dont vous disposez. Il ne fait que rassembler des modèles et des vues spécifiques.

2 votes

@theband : Vous puede ont plusieurs DispatcherServlets si votre architecture a plus de sens de cette façon, mais en général il n'y a aucune raison de le faire.

6voto

user2663609 Points 11

Nous pouvons dire comme DispatcherServlet qui s'occupe de tout dans Spring MVC.

Au démarrage du conteneur web :

  1. DispatcherServlet sera chargé et initialisé en appelant init() méthode
  2. init() de DispatcherServlet essaiera d'identifier le document de configuration de Spring avec des conventions d'appellation telles que "servlet_name-servlet.xml" alors tous les haricots peuvent être identifiés.

Exemple :

public class DispatcherServlet extends HttpServlet {

    ApplicationContext ctx = null;

    public void init(ServletConfig cfg){
        // 1. try to get the spring configuration document with default naming conventions
        String xml = "servlet_name" + "-servlet.xml";

        //if it was found then creates the ApplicationContext object
        ctx = new XmlWebApplicationContext(xml);
    }
    ...
}

Donc, en général DispatcherServlet capture l'URI de la demande et le transmet à HandlerMapping . HandlerMapping rechercher le bean de mapping avec la méthode du contrôleur, où le contrôleur retourne le nom logique (vue). Ensuite, ce nom logique est envoyé à DispatcherServlet par HandlerMapping . Ensuite, DispatcherServlet dire à ViewResolver pour donner l'emplacement complet de la vue en ajoutant le préfixe et le suffixe, puis DispatcherServlet donner une vue au client.

0 votes

C'est une bonne explication. Votre point numéro 2 dit que le DispatcherServlet va essayer d'identifier le document de configuration de Spring avec des conventions de nommage comme "nom_du_servlet.xml". Cependant, j'ai vu des projets qui utilisaient des noms comme "dispatcher" seulement, et cela fonctionne bien. J'ai aussi essayé cela. Mais je ne sais pas pourquoi ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X