Il y a quelques jours, j’ai commencé à étudier ce tutoriel Spring Hello World: http://viralpatel.net/blogs/spring-3-mvc-create-hello-world-application-spring-3-mvc/
Dans ce tutoriel, Spring DispatcherServlet est configuré avec le fichier spring-servlet.xml , celui-ci:
Dans ce fichier, j’utilise la balise context: component-scan pour dire que Spring doit parsingr mon fichier à la recherche de l’annotation, par exemple, lorsque la classe du contrôleur trouve qu’une annotation est annotée par @RequestMapping (“/ hello”) sait que cette méthode gère la requête HTTP vers l’URL se terminant par “/ hello”. C’est simple …
Maintenant, mon doute est lié au projet de modèle Spring MVC que je pourrais créer automatiquement dans STS \ Eclipse.
Lorsque je crée un nouveau projet Spring MVC dans STS, mon DispatcherServlet est configuré par un fichier nommé servlet-context.xml contenant une configuration similaire à celle du fichier exemple précédent.
Dans ce fichier, j’ai toujours la balise scan de composant:
mais j’ai aussi une autre balise (qui ressemble à une tâche similaire), celle-ci:
Quelle est la différence entre ces deux balises?
Une autre chose “étrange” est que l’exemple précédent (qui n’utilise pas la balise pilotée par les annotations) est très similaire au projet créé par STS en utilisant le projet Spring MVC Template mais si je supprime la balise pilotée par des annotations de sa configuration ne pas exécuter le projet et donnez-moi l’erreur suivante: HTTP Status 404 –
Et dans le stacktrace j’ai:
WARN: org.springframework.web.servlet.PageNotFound – Aucun mappage trouvé pour la requête HTTP avec l’URI [/ maventestwebapp /] dans DispatcherServlet avec le nom ‘appServlet’
Mais pourquoi? L’exemple précédent fonctionne bien sans balise pilotée par des annotations, et cette classe de contrôleurs est très similaire. En fait, il existe une seule méthode qui gère la requête HTTP vers le chemin “/”
Ceci est le code de ma classe de contrôleur:
package com.mycompany.maventestwebapp; import java.text.DateFormat; import java.util.Date; import java.util.Locale; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; /** * Handles requests for the application home page. */ @Controller public class HomeController { private static final Logger logger = LoggerFactory.getLogger(HomeController.class); /** * Simply selects the home view to render by returning its name. */ @RequestMapping(value = "/", method = RequestMethod.GET) public Ssortingng home(Locale locale, Model model) { logger.info("Welcome home! The client locale is {}.", locale); Date date = new Date(); DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale); Ssortingng formattedDate = dateFormat.format(date); model.addAtsortingbute("serverTime", formattedDate ); return "home"; }
Est-ce que quelqu’un peut m’aider à comprendre cette chose?
Merci beaucoup!
signifie que vous pouvez définir des dépendances de beans spring sans avoir à spécifier un groupe d’éléments dans XML ou implémenter une interface ou étendre une classe de base. Par exemple, @Repository
indique à Spring qu’une classe est un Dao sans avoir à étendre JpaDaoSupport
ou une autre sous-classe de DaoSupport. De même, @Controller
indique à Spring que la classe spécifiée contient des méthodes qui gèrent les requêtes HTTP sans que vous ayez à implémenter l’interface Controller ou à étendre une sous-classe qui implémente le contrôleur.
Au démarrage du spring, il lit son fichier de configuration XML et recherche
et que Foo a été marqué avec @Controller
il sait que la classe est un contrôleur et le traite comme tel. Par défaut, Spring suppose que toutes les classes qu'il doit gérer sont explicitement définies dans le fichier beans.XML.
Le balayage des composants avec
à Spring qu’il doit rechercher le classpath pour toutes les classes sous com.mycompany.maventestweapp et examiner chaque classe pour voir si a un @Controller
, ou @Repository
, ou @Service
ou @Component
et si c'est le cas, Spring enregistrera la classe avec la fabrique de bean comme si vous aviez tapé
dans la configuration XML des dossiers.
Dans une application Spring MVC classique, vous trouverez deux fichiers de configuration de spring, un fichier qui configure le contexte d'application généralement démarré avec l'écouteur de contexte Spring.
org.springframework.web.context.ContextLoaderListener
Et un fichier de configuration Spring MVC démarre généralement avec le servlet Spring dispatcher. Par exemple.
main org.springframework.web.servlet.DispatcherServlet 1 main /
Spring prend en charge les fabriques de beans hiérarchiques. Dans le cas de Spring MVC, le contexte de servlet du dissortingbuteur est un enfant du contexte de l'application principale. Si le contexte de servlet a été demandé pour un bean appelé "abc", il recherchera d'abord le contexte du servlet, s'il ne le trouve pas, il examinera le contexte parent, qui est le contexte de l'application.
Les beans communs tels que les sources de données, la configuration JPA, les services métier sont définis dans le contexte de l'application alors que la configuration spécifique de MVC ne correspond pas au fichier de configuration associé au servlet.
J'espère que cela t'aides.
indique à Spring d’parsingr ces packages pour les annotations.
enregistre un RequestMappingHanderMapping, un RequestMappingHandlerAdapter et un ExceptionHandlerExceptionResolver pour prendre en charge les méthodes de contrôleur annotées telles que @RequestMapping, @ExceptionHandler, etc. fournies avec MVC.
Cela permet également un ConversionService qui prend en charge le formatage des sorties piloté par Annotation ainsi que la validation par annotation pour les entrées. Il active également la prise en charge de @ResponseBody que vous pouvez utiliser pour renvoyer des données JSON.
Vous pouvez accomplir les mêmes choses en utilisant la configuration basée sur Java en utilisant @ComponentScan (basePackages = {“…”, “…”} et @EnableWebMvc dans une classe @Configuration.
Consultez la documentation 3.1 pour en savoir plus.
http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#mvc-config
Les annotations indiquent à Spring qu’il doit rechercher les beans annotés et ne pas se contenter de la configuration des beans XML. Component-scan indique où rechercher ces beans.
Voici quelques doc: http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-config-enable