2011-01-07 17 views
12

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> 

Respuesta

9

De forma predeterminada, Spring establece el valor del pedido de HandlerMapping en Integer.MAX_VALUE, lo que da el orden de precedencia más bajo. Cuando se carga la configuración del despachador por primera vez, DispatcherServlet usará estos valores para ordenar la lista de HandlerMapping.

Si no se establece el valor explícito de la orden, todo el objeto de asignación de controlador tendrá el mismo orden de Integer.MAX_VALUE. Por lo tanto, después de la clasificación, el orden de las asignaciones de manejador seguirá siendo el mismo que el orden de las definiciones de beans.[esto suena como un error en la implementación del despachador]

Por lo tanto, si los valores de orden de las asignaciones de manejador se establecen explícitamente, es seguro poner la etiqueta <mvc:default-servlet-handler/> en cualquier parte de la definición de bean.

Aquí es ejemplo:

<?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

Creo que esto se debe a la mala redacción en la documentación.

Se configura un DefaultServletHttpRequestHandler con una asignación de dirección URL (dado un orden de prioridad más baja) de "/**"

Creo que esto significa que debe darle un orden de prioridad más baja, y no que la primavera va a hacer esto automáticamente

No entiendo por qué ponerlo en la ubicación 4 no funciona, sin embargo, no veo diferencia entre la ubicación 4 y la ubicación 3: el adaptador del manejador no debería interferir con la prioridad del mapeo.

+0

pero no se puede establecer el orden de este mapeo a través de esta etiqueta. – gigadot

+0

@gigadot: el orden está implícito en el orden de las definiciones de bean. – skaffman

+0

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

Cuestiones relacionadas