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>
Ale nie można ustawić kolejność tego mapowania za pomocą tego tagu. – gigadot
@gigadot: kolejność jest ukryta w kolejności definicji komponentów bean. – skaffman
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