2011-01-07 2 views
12

В моем web.xml сопоставление сервлетов по умолчанию, то есть /, сопоставляется диспетчеру Spring. В моей конфигурации диспетчера весов у меня есть DefaultAnnotationHandlerMapping, ControllerClassNameHandlerMapping и AnnotationMethodHandlerAdapter, что позволяет мне отображать URL-адрес контроллеров либо по его названию класса, либо по его аннотации @Requestmapping. Однако в корневой папке есть некоторые статические ресурсы, которые я также хочу, чтобы диспетчер весны работал с использованием сервлета по умолчанию. Согласно Spring documentation, это можно сделать с помощью тега <mvc:default-servlet-handler/>.Куда поместить обработчик сервлета по умолчанию в конфигурации Spring MVC

В приведенной ниже конфигурации есть 4 места кандидата, которые я обозначил, которые можно вставить в этот тег. Установка тега в другом месте приводит к диспетчеру вести себя по-другому следующим образом:

Случай 1: Если вставить его на место 1, диспетчер больше не будет иметь возможность обрабатывать отображение по имени класса @RequestMapping и контроллер но он будет обслуживать статический контент в обычном режиме.

Cas 2, 3: Он сможет обрабатывать отображение с помощью имени класса @RequestMapping и класса контроллера, а также обслуживать статический контент, если другое сопоставление не может быть выполнено успешно.

Дело 4: Оно не сможет служить статическому содержимому.Примечание: Это была ошибка при реализации контроллера, который имеет метод, сопоставленный с /**, но не имеет явного сопоставления запросов в имени класса контроллера.

Поэтому Случай 2 и желательны .Согласно пружинные документации, этот тег настраивает обработчик, который старшинство порядок уделяется самым низким, так почему вопросам позиции? и Какая позиция лучше всего разместить в этом теге?

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

ответ

9

По умолчанию Spring устанавливает значение порядка HandlerMapping в Integer.MAX_VALUE, что дает наименьший приоритет. Когда конфигурация диспетчера загружается в первый раз, DispatcherServlet будет использовать эти значения для сортировки списка HandlerMapping.

Если явное значение порядка не установлено, то весь объект сопоставления обработчика будет иметь тот же порядок Integer.MAX_VALUE. Таким образом, после сортировки порядок отображений обработчиков останется таким же, как и порядок определений бобов.[это звучит как ошибка при реализации диспетчера]

Таким образом, если значения порядка сопоставлений обработчиков явно заданы, безопасно помещать тег <mvc:default-servlet-handler/> в любом месте определения компонента.

Вот пример:

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

Я думаю, что это плохо написано в документации.

Он настраивает DefaultServletHttpRequestHandler с отображением URL (с учетом наименьшего порядка старшинства) из "/**"

Я думаю, что это означает, что вы должны придать ему более низкий порядок старшинства, а не то, что весна будет делать это автоматически.

Я не понимаю, почему его размещение в местоположении 4 не работает, однако я не вижу разницы между местоположением 4 и местоположением 3 - адаптер обработчика не должен мешать приоритету сопоставления.

+0

Но вы не можете установить порядок отображения этого через этот тег. – gigadot

+0

@gigadot: порядок неявна в порядке определений компонентов. – skaffman

+0

Вы правы в том, что между местоположением 3 и 4. нет никакого различия. Я обновил вопрос и ответ. Spring дает минимальный порядок приоритетов для сопоставления обработчиков, который настроен тегом mvc: default-servlet-handler, но он также дает такое же значение для другого отображения обработчика, если явное значение не задано. Кстати, спасибо за ваш ответ. – gigadot