将default-servlet-handler放在Spring MVC配置中的位置

时间:2011-01-07 09:47:07

标签: java spring-mvc

在我的web.xml中,默认的servlet映射(即/)映射到Spring调度程序。在我的Spring调度程序配置中,我有DefaultAnnotationHandlerMappingControllerClassNameHandlerMappingAnnotationMethodHandlerAdapter,它允许我通过其类名或其@Requestmapping注释将url映射到控制器。但是,Web根目录下有一些静态资源,我也希望spring调度程序使用默认的servlet来提供服务。根据{{​​3}},可以使用<mvc:default-servlet-handler/>代码完成此操作。

在下面的配置中,我标记了4个候选位置,可以插入此标记。将标记插入不同的位置会导致调度程序的行为方式如下:

案例1 :如果我将其插入位置1,调度程序将无法再通过@RequestMapping和控制器类名称处理映射,但它将正常提供静态内容。 / p>

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>

2 个答案:

答案 0 :(得分:9)

默认情况下,Spring将HandlerMapping的顺序值设置为Integer.MAX_VALUE,它给出了最低优先级顺序。第一次加载调度程序配置时,DispatcherServlet将使用此值对HandlerMapping列表进行排序。

如果未设置order的显式值,则所有处理程序映射对象将具有相同的Integer.MAX_VALUE顺序。因此,在排序之后,处理程序映射的顺序将保持与bean定义的顺序相同。 [这听起来像是调度员实施中的一个错误]

因此,如果显式设置了处理程序映射的顺序值,则可以将<mvc:default-servlet-handler/>标记放在bean定义中的任何位置。

以下是示例:

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

答案 1 :(得分:2)

我认为这取决于文档中的措词不当。

  

它使用DefaultServletHttpRequestHandler

的URL映射(给定最低优先级顺序)配置"/**"

我认为这意味着你应该给它一个更低的优先顺序,而不是Spring会自动执行此操作。

我不明白为什么把它放在位置4不起作用,但我发现位置4和位置3之间没有区别 - 处理程序适配器不应该干扰映射优先级。