В моем 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>