Подтвердить что ты не робот

Где установить обработчик сервлета по умолчанию в конфигурации Spring MVC

В моем web.xml сопоставление сервлетов по умолчанию, т.е. /, отображается на диспетчер Spring. В конфигурации диспетчера Spring у меня есть DefaultAnnotationHandlerMapping, ControllerClassNameHandlerMapping и AnnotationMethodHandlerAdapter, что позволяет мне сопоставлять URL-адрес контроллерам либо его именем класса, либо его аннотацией @Requestmapping. Тем не менее, есть некоторые статические ресурсы в корневой папке, которые я также хочу, чтобы диспетчер Spring работал с использованием сервлета по умолчанию. Согласно 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>
4b9b3361

Ответ 1

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

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

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

Вот пример:

<?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 (с учетом наименьшего порядка приоритета) "/**"

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

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