В моем 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>
Но вы не можете установить порядок отображения этого через этот тег. – gigadot
@gigadot: порядок неявна в порядке определений компонентов. – skaffman
Вы правы в том, что между местоположением 3 и 4. нет никакого различия. Я обновил вопрос и ответ. Spring дает минимальный порядок приоритетов для сопоставления обработчиков, который настроен тегом mvc: default-servlet-handler, но он также дает такое же значение для другого отображения обработчика, если явное значение не задано. Кстати, спасибо за ваш ответ. – gigadot