Где разместить default-servlet-handler в конфигурации Spring MVC - PullRequest
12 голосов
/ 07 января 2011

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

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

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

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

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

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

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

Ответы [ 2 ]

8 голосов
/ 07 января 2011

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

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

Таким образом, если значения порядка отображений обработчиков установлены явно, можно поместить тег <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 голосов
/ 07 января 2011

Я думаю, что это из-за плохой формулировки в документации.

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...