2011-01-07 10 views
12

W moim web.xml, domyślne mapowanie serwletu, tj. /, jest zmapowane do dyspozytora sprężyn. W mojej konfiguracji dyspozytora wiosennego mam DefaultAnnotationHandlerMapping, ControllerClassNameHandlerMapping i AnnotationMethodHandlerAdapter, co pozwala mi mapować adres URL do kontrolerów poprzez nazwę klasy lub jej adnotację. Jednak w katalogu głównym znajdują się statyczne zasoby, które również chcę, aby program rozsyłający wiosenny służył do używania domyślnego serwletu. Według Spring documentation, można to zrobić przy użyciu znacznika <mvc:default-servlet-handler/>.Gdzie umieścić domyślny-servlet-handler w konfiguracji Spring MVC

W poniższej konfiguracji znajdują się 4 potencjalne lokalizacje, które zaznaczyłem i które są możliwe do wstawienia tego znacznika. Wstawianie znacznika w innym miejscu powoduje, że dyspozytor zachowywać się inaczej, jak następuje:

Przypadek 1: Gdybym wstawić go na miejscu 1, dyspozytor nie będzie już w stanie obsłużyć mapowanie przez @RequestMapping i nazwy klasy kontrolera ale będzie normalnie obsługiwać zawartość statyczną.

Cas 2, 3: To będzie w stanie obsłużyć mapowanie przez @RequestMapping i kontrolera nazwa klasy, a także obsługujących zawartość statyczną czy inne mapowanie nie mogą być wykonane pomyślnie.

Przypadek 4: Nie będzie w stanie obsłużyć statycznej zawartości.Usunięcie Uwaga: To był błąd podczas implementacji kontrolera, który ma metodę zmapowaną na /**, ale nie ma jawnego odwzorowania żądań na nazwie klasy kontrolera.

Dlatego Przypadek 2 i są pożądane .Według Wiosna dokumentację, ten tag konfiguruje kolejność obsługi których pierwszeństwo daje się najniższymi więc dlaczego sprawach stanowisko? i która jest najlepsza pozycja do umieszczenia tego tagu?

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

Odpowiedz

9

Domyślnie Spring ustawia wartość zamówienia HandlerMapping na Integer.MAX_VALUE, co daje najniższą kolejność pierwszeństwa. Gdy konfiguracja programu rozsyłającego zostanie załadowana po raz pierwszy, DispatcherServlet będzie używać tych wartości do sortowania listy HandlerMapping.

Jeśli nie zostanie ustawiona jawna wartość zamówienia, wówczas cały obiekt odwzorowania procedury obsługi będzie miał tę samą kolejność co Integer.MAX_VALUE. Zatem po sortowaniu kolejność odwzorowań obsługi pozostanie taka sama jak kolejność definicji ziaren.[to brzmi jak błąd w implementacji dyspozytora]

Dlatego jeśli wartości zleceń mapowania obsługi są jawnie ustawione, można bezpiecznie umieścić znacznik <mvc:default-servlet-handler/> w dowolnym miejscu definicji fasoli.

Oto przykład:

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

Sądzę, że jest to spowodowane złym sformułowaniem w dokumentacji.

To konfiguruje DefaultServletHttpRequestHandler z mapowaniem URL (podanej najniższy porządek pierwszeństwo) z "/**"

Myślę, że to oznacza, że ​​powinny dać niższą kolejność pierwszeństwa, a nie, że wiosna zrobi to automatycznie.

Nie rozumiem, dlaczego umieszczenie go w lokalizacji 4 nie działa, chociaż nie widzę różnicy między położeniem 4 a położeniem 3 - adapter obsługi nie powinien kolidować z pierwszeństwem mapowania.

+0

Ale nie można ustawić kolejność tego mapowania za pomocą tego tagu. – gigadot

+0

@gigadot: kolejność jest ukryta w kolejności definicji komponentów bean. – skaffman

+0

Masz rację, że nie ma różnicy między lokalizacjami 3 i 4. Zaktualizowałem pytanie i odpowiedź. Spring daje najniższy porządek priorytetu dla mapowania handlerów, który jest skonfigurowany przez znacznik 'mvc: default-servlet-handler', ale daje również taką samą wartość dla mapowania innych programów obsługi, jeśli nie została ustawiona jawna wartość. BTW, dziękuję za odpowiedź. – gigadot