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