Lien : https://docs.spring.io/spring/docs/3.0.0.M4/reference/html/ch15s02.html
Spring mvc : dispatches requests to controllers and offers other functionality that facilitates the development of web applications.
Spring's DispatcherServlet however, does more than just that. It is completely integrated with the Spring IoC container and as such allows you to use every other feature that Spring has.
When sending a request to your application the following happens:
WebApplicationContext est un ApplicationContext. Elle permet d'accéder aux beans spring créés.
2 articles très intéressants à ce sujet :
Par contre, on n'a qu'1 servletContext par application web (comprendre war). =⇒ on peut faire webApplicationContext.getServletContext() pour le récupérer.
webApplicationContext.getServletContext().getContextPath() : est bien le application context path
Des bean spring en plus que la servlet va utiliser pour traiter ses requêtes :
Particularité/ajout de WebApplicationContext par rapport au ApplicationContext :
On peut changer la classe de contexte dans les paramètre d'initialisation (dans le web.xml) : avec la balise <contextClass>.
Remarque : <contextConfigLocation> permet de changer le path du xml définissant les beans spécifiques pour cette servlet : [servlet-name]-servlet.xml
Mettre ça dans l'appContext.xml <context:component-scan base-package=“packageToControllers”/>
ModelAndView, ModelMap, Model
@Controller
@RequestMapping
@PathVariable @RequestParam(“a_GET_param”)
@ResponseBody
@SessionAttributes et @ModelAttribute : pour une variable dans une session
@CookieValue : bound to http header cookie attribute of payload @RequestHeader
Exemple :
@RequestMapping(value="/owners/{ownerId}/pets/{petId}", method=RequestMethod.GET)
voir doc : Avec les versions de spring >=2.5, les méthodes annotées @RequestMapping sont scannées par le bean DefaultAnnotationHandlerMapping, qui instancié par défaut.
Cela dit, on peut redéfinir cette instance. Exemple :
<sxh xml>
<beans>
<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="interceptors">
<bean class="example.MyInterceptor"/>
</property>
</bean>
</sxh> <beans>
On peut aussi instancier d'autre HandlerMapping, comme SimpleUrlHandlerMapping (voir doc), par exemple dans le servlet15-servlet.xml
On peut par contre redéfinir ses propriétés :
before() : executée avant l'exécution du HandlerMapping
after() : executée après l'exécution du HandlerMapping
complete() : executée après l'exécution de compète de la requête
preHandle(..) : retourne true ou false pour stopper la chaine à venir des HandlerMappings (par exemple )
quand elle retourne false, alors ca signifie que ce HandlerMapping a bien pris en compte et traité la requête donc les autres HandlerMapping ne seront pas exécuté
Exemple concret dans la doc : https://docs.spring.io/spring/docs/3.0.0.M4/reference/html/ch15s04.html
Spring met à disposition pleins de type de view resolver :
Le view resolver est donc appelé par un HanderMapping.
Dans tous les cas, un view resolver prend en entrée un ModelAndView, puis tenter de retrouver la fameuse vue. Si il la trouve il la retourne (arrête la chaine de résolution, voir en dessous), sinon il retournera null.
Dans le cas des jsp (InternalResourceViewResolver) il cherche la vue à partir d'un RequestDispatcher (en type FORWARD (RequestDispatcher.forward(…)) retourne une InternalView si il la trouve. Hors il en trouve une forcément une, sinon il retourne la une sorte de view “Error”.
Il est possible de chainer plusieurs views resolver. Il faut alors définir un ordre dans lequel il doivent chercher
Dans tous les cas, si aucune vue n'a été trouvée, alors spring lance une exception.
return new ModelAndView("forward:/mesPagesJsps/log4jAdmin.jsp");
Ca n'utilisera pas l'InternalResourcesViewResolver, mais ça retournera bien une InternalResourcesView et ça forwardera.
Le forward est censé faire une recherche interne d'une resource sans que le navigateur client ne soit au courant.
request.getRequestDispatcher("HomeServlet").forward(request, response);
When calling this method, the server sends back a HTTP status code of 302 (temporary redirect) which causes the web browser to issue a brand new HTTP GET request for the content at the redirected location.
response.sendRedirect( "home.jsp?name=Hussein Terek" );
Permet, au cours du traitement de la requete, d'embarquer une vue ou autre chose dans la réponse, puis de continuer le traitement de la réponse la où on en était.
request.getRequestDispatcher("home.jsp").include(request, response);
https://docs.spring.io/spring/docs/3.0.0.M4/reference/html/ch03s10.html#beans-scanning-filters
By default, classes annotated with @Component, @Repository, @Service, @Controller, or a custom annotation that itself is annotated with @Component are the only detected candidate components.
@Qualifier (de spring et de javax)
@Genre
@Offline
On peut filtrer pour ne pas créer certains composants Exemple :
<beans ...>
<context:component-scan base-package="org.example">
<context:include-filter type="regex" expression=".*Stub.*Repository"/>
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
</beans>
@Scope(scopeName="")
//ConfigurableBeanFactory.SCOPE_PROTOTYPE
//ConfigurableBeanFactory.SCOPE_SINGLETON
//WebApplicationContext.SCOPE_APPLICATION
//WebApplicationContext.SCOPE_REQUEST
//WebApplicationContext.SCOPE_SESSION
ScopeMetadataResolver