Nel mio web.xml
, la mappatura servlet predefinita, ovvero /
, è associata al dispatcher Spring. Nella mia configurazione di dispatcher di primavera, ho DefaultAnnotationHandlerMapping
, ControllerClassNameHandlerMapping
e AnnotationMethodHandlerAdapter
che mi consente di eseguire il mapping dell'url ai controller tramite il nome della classe o l'annotazione @Requestmapping
. Tuttavia, ci sono alcune risorse statiche sotto la web root che voglio anche che il dispatcher di primavera funzioni usando il servlet di default. Secondo Spring documentation, questo può essere fatto usando il tag <mvc:default-servlet-handler/>
.Dove inserire il servlet-servlet predefinito nella configurazione Spring MVC
Nella configurazione seguente, sono presenti 4 posizioni candidate contrassegnate che è possibile inserire questo tag. Inserendo il tag in posizione diversa fa sì che il dispatcher a comportarsi in modo diverso come segue:
Caso 1: se lo inserisco nella posizione 1, il dispatcher non sarà più in grado di gestire la mappatura dal @RequestMapping e regolatore nome della classe ma servirà normalmente il contenuto statico.
Cas 2, 3: Sarà in grado di gestire il mapping con @RequestMapping e il nome della classe controller, oltre a servire il contenuto statico se non è possibile eseguire altre mappature.
Caso 4: Non sarà in grado di servire il contenuto statico.Nota di rimozione: si è verificato un errore durante l'implementazione di un controller che ha un metodo associato a /**
ma non ha un mapping esplicito delle richieste sul nome della classe del controller.
Pertanto, Caso 2 e sono .Secondo auspicabile primavera documentazione, questo tag configura un gestore, che ordine di precedenza è data ai più bassi così perché le questioni di posizione? e qual è la migliore posizione per inserire questo tag?
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<context:annotation-config/>
<context:component-scan base-package="webapp.controller"/>
<!-- Location 1 -->
<!-- Enable annotation-based controllers using @Controller annotations -->
<bean id="annotationUrlMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
<!-- Location 2 -->
<bean id="controllerClassNameHandlerMapping" class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
<!-- Location 3 -->
<bean id="annotationMethodHandlerAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
<!-- Location 4 -->
<mvc:default-servlet-handler/>
<!-- All views are JSPs loaded from /WEB-INF/jsp -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
Ma non si può impostare l'ordine di questa mappatura attraverso questo tag. – gigadot
@gigadot: l'ordine è implicito nell'ordine delle definizioni del bean. – skaffman
Hai ragione sul fatto che non ci sono differenze tra la posizione 3 e 4. Ho aggiornato la domanda e la risposta. Spring fornisce l'ordine di precedenza più basso al mapping del gestore che è configurato dal tag 'mvc: default-servlet-handler ', ma fornisce anche lo stesso valore all'altra mappatura del gestore se il valore esplicito non è impostato. A proposito, grazie per la vostra risposta. – gigadot