2011-01-07 18 views
12

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> 

risposta

9

Per impostazione predefinita, Spring imposta il valore dell'ordine da HandlerMapping a Integer.MAX_VALUE che fornisce l'ordine di precedenza più basso. Quando la configurazione del dispatcher viene caricata per la prima volta, DispatcherServlet utilizzerà questi valori per ordinare l'elenco di HandlerMapping.

Se il valore esplicito dell'ordine non è impostato, tutti gli oggetti di mappatura del gestore avranno lo stesso ordine di Integer.MAX_VALUE. Pertanto, dopo l'ordinamento, l'ordine dei mapping del gestore rimarrà lo stesso dell'ordine delle definizioni dei bean.[questo sembra un bug nell'implementazione del dispatcher]

Pertanto, se i valori dell'ordine dei mapping del gestore sono impostati in modo esplicito, è possibile inserire il tag <mvc:default-servlet-handler/> in qualsiasi punto della definizione del bean.

Ecco esempio:

<?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"/> 

    <mvc:default-servlet-handler /> 

    <!-- Enable annotation-based controllers using @Controller annotations --> 
    <bean id="annotationUrlMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
     <property name="order" value="0" /> 
    </bean> 

    <bean id="controllerClassNameHandlerMapping" class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"> 
     <property name="order" value="1" /> 
    </bean> 

    <bean id="annotationMethodHandlerAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/> 

    <!-- 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> 
2

Penso che questo sia dovuto a una formulazione non corretta nella documentazione.

Si configura un DefaultServletHttpRequestHandler con una mappatura URL (dato un ordine di precedenza più basso) di "/**"

Penso che questo significa che dovrebbe dare un ordine di precedenza inferiore, e non che la primavera farà questo automaticamente.

Non capisco perché inserendolo nella posizione 4 non funzioni, tuttavia, non vedo alcuna differenza tra la posizione 4 e la posizione 3: l'adattatore del gestore non deve interferire con la precedenza della mappatura.

+0

Ma non si può impostare l'ordine di questa mappatura attraverso questo tag. – gigadot

+0

@gigadot: l'ordine è implicito nell'ordine delle definizioni del bean. – skaffman

+0

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

Problemi correlati