En mi web.xml
, la asignación de servlets predeterminada, es decir, /
, se asigna a Spring dispatcher. En mi configuración del distribuidor Spring, tengo DefaultAnnotationHandlerMapping
, ControllerClassNameHandlerMapping
y AnnotationMethodHandlerAdapter
que me permiten asignar url a los controladores por su nombre de clase o por su anotación @Requestmapping
. Sin embargo, hay algunos recursos estáticos debajo de la raíz de la web que también deseo que el distribuidor de Spring sirva usando el servlet predeterminado. De acuerdo con Spring documentation, esto se puede hacer usando la etiqueta <mvc:default-servlet-handler/>
.Dónde colocar el manejador de servlets predeterminado en la configuración Spring MVC
En la siguiente configuración, hay 4 ubicaciones candidatas que he marcado que son posibles para insertar esta etiqueta. La inserción de la etiqueta en un lugar diferente hace que el despachador se comporte de manera diferente de la siguiente manera:
Caso 1: Si lo inserte en la posición 1, el despachador ya no será capaz de manejar la cartografía por el nombre de la clase y el controlador @RequestMapping pero servirá el contenido estático normalmente.
Cas 2, 3: Podrá gestionar el mapeo por @RequestMapping y el nombre de la clase del controlador, así como servir el contenido estático si no se puede realizar otro mapeo correctamente.
Caso 4: No será capaz de servir el contenido estático.Nota de eliminación: Esto fue un error al implementar un controlador que tiene un método asignado a /**
pero no tiene una asignación de solicitud explícita en el nombre de la clase del controlador.
Por lo tanto, Caso 2 y son .Según deseable primavera documentación, esta etiqueta, que configura un controlador de orden de prioridad se da a modo qué es importante la posición más baja? y ¿Cuál es la mejor posición para poner esta etiqueta?
<?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>
pero no se puede establecer el orden de este mapeo a través de esta etiqueta. – gigadot
@gigadot: el orden está implícito en el orden de las definiciones de bean. – skaffman
Tiene razón acerca de que no hay diferencia entre la ubicación 3 y 4. He actualizado la pregunta y la respuesta. Spring da el orden de precedencia más bajo al mapeo de controlador que se configura mediante la etiqueta 'mvc: default-servlet-handler', pero también da el mismo valor a la asignación de otro manejador si el valor explícito no está establecido. Por cierto, gracias por tu respuesta. – gigadot