Le contenu de cet article concerne les étapes d'exécution après le lancement du projet Spring MVC (avec diagramme schématique). Les amis dans le besoin peuvent s'y référer.
Processus d'exécution après le démarrage du projet Spring MVC :
1. Processus d'exécution :
01. Lorsque le projet Web est démarré, chargez le fichier web.xml, y compris. le fichier de configuration principal
Étant donné que le contrôleur principal de mvc est défini dans le fichier web.xml, ce contrôleur sera initialisé
02. Par exemple, le chemin de requête de l'utilisateur est localhost:8080/. bonjour
À ce moment, /hello sera considéré comme le chemin de la requête ====> L'identifiant du bean dans le fichier de configuration principal
03./hello sera intercepté par le contrôleur principal et accédez au mappeur de gestionnaires (HandlerMapping)
04. La couche inférieure trouve d'abord le HandlerMapping approprié, puis renvoie une chaîne d'exécution de processeur (HandlerExecutionChain)
05. qui est sur le point d'être exécuté et (1-N Interceptor)
06. Rechercher HandlerAdapter en fonction du gestionnaire de la chaîne d'exécution du processeur
07. HandlerAdapter exécute la méthode spécifiée en fonction du type de. notre contrôleur
08. Après avoir exécuté la méthode, il faut retourner un ModleAndView
Modle ==》Map
View ==》String
09. l'analyseur de vue est défini, il sera exécuté. La vue est en fait une logique. Le nom de la vue
n'a pas d'analyseur de vue défini et sera exécuté. Le préfixe et le suffixe n'ont aucune valeur. nom de la vue physique
Schéma :
2. Afficher le code sous-jacent
01. Cliquez sur le contrôleur principal dans le fichier web.xml
02. Ctrl+ o Trouvez la méthode correspondante doDispatch
03. Commencez à analyser le code
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) HttpServletRequest processedRequest = request; //请求对象 HandlerExecutionChain mappedHandler = null; //处理器执行链=我们即将执行的Controller+(1+拦截器) boolean multipartRequestParsed = false; //解析一个请求是否是文件上传请求
04. . Recherchez le code suivant
// Determine handler for the current request. mappedHandler = getHandler(processedRequest);
Trouvez le gestionnaire qui doit être exécuté selon notre demande (Contrôleur)
Ctrl+bouton gauche de la souris et cliquez sur getHandler()
J'ai trouvé que le retour. La valeur de cette méthode est une chaîne d'exécution du processeur !
05. Après avoir entré getHandler, recherchez le code suivant
HandlerExecutionChain handler = hm.getHandler(request);
06 Continuez à saisir hm.getHandler(request) ici
Après avoir entré, j'ai trouvé que ceci. méthode est un Il n'y a pas d'implémentation de méthode pour la méthode dans l'interface (HandlerMapping), alors continuez à cliquer sur la classe d'implémentation AbstractHandlerMapping
07 Trouvez le code suivant et cassez le point
Object handler = getHandlerInternal(request);<.>08. Ensuite, vous constatez que vous obtenez La chaîne d'exécution du processeur donne à notre contrôleur principal
// Determine handler adapter for the current request. HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());et cliquez sur getHandlerAdapter() 09. Recherchez le point d'arrêt de code suivant
if (ha.supports(handler)) { return ha; }10. Cliquez sur supports()11. Trouvé que supports() est dans l'interface, mais il y a 5 classes d'implémentation qui en exécuteront 3 par défaut. mais le HelloController que nous avons écrit implémente indirectement l'interface Controller, il nous suffit donc de casser le point dans le SimpleControllerHandlerAdapter ! 12. Renvoyez le HandlerAdapter obtenu au contrôleur principal13 Avec l'adaptateur de processeur dans le contrôleur principal, l'étape suivante consiste à exécuter le vrai code14. Cliquez sur handle
// Actually invoke the handler. mv = ha.handle(processedRequest, response, mappedHandler.getHandler());15. Cliquez sur handleRequest
@Override public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return ((Controller) handler).handleRequest(request, response); }
pour entrer dans le AbstractController. Notre HelloController hérite de cette classe !
Cette classe parent exécute handleRequestInternal(request, réponse);
16. Cliquez sur handleRequestInternal
pour trouver notre classe d'implémentation
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!