2011-01-07 9 views
12

私のweb.xmlには、デフォルトのサーブレットマッピング(/)がSpringディスパッチャにマッピングされています。 Springのディスパッチャ設定では、私はDefaultAnnotationHandlerMappingControllerClassNameHandlerMappingAnnotationMethodHandlerAdapterを持っていますので、クラス名または@Requestmapping注釈でコントローラにURLをマップできます。しかし、Webルートの下に静的なリソースがあり、デフォルトのサーブレットを使ってSpringのディスパッチャを提供したいと思っています。 Spring documentationによれば、これは<mvc:default-servlet-handler/>タグを使用して行うことができます。Spring MVCコンフィグレーションでdefault-servlet-handlerを配置する場所

以下の設定では、このタグを挿入することが可能な4つの候補地点があります。

ケース1:別の場所にタグを挿入すると、ディスパッチャは、次のように異なる動作をさせ、私は場所1でそれを挿入した場合、ディスパッチャはもはや@RequestMappingとコントローラのクラス名でマッピングを処理することができません静的なコンテンツを正常に配信します。

Cas 2、3:@RequestMappingとコントローラクラス名によるマッピングを処理することができます。また、他のマッピングが正常に実行できない場合は静的コンテンツを提供することができます。

ケース4:静的コンテンツを配信することはできません。削除の注意:/**にマッピングされたメソッドを持つコントローラを実装すると、コントローラクラス名に明示的な要求マッピングがないというバグです。

したがって、ケース2とは、ドキュメントを春にすることが望ましい.Accordingあり、このタグは、優先順位が最も低いので、なぜ位置事項に与えられているハンドラを設定しますか?このタグを置くのに最適な位置はどれですか?

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

答えて

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

これはドキュメントの貧弱な言い回しです。

は、それは私が、これはあなたがそれを低優先順位を与えるべきであることを意味だと思う"/**"

の(最低の優先順位与えられた)URLマッピングとDefaultServletHttpRequestHandlerを構成し、ないその春が行いますこれは自動的に行われます。

私は場所4に配置することはできませんが、場所4と場所3の間に違いは見られません。ハンドラアダプタはマッピングの優先順位を妨げてはいけません。

+0

しかし、あなたはこのタグによって、このマッピングの順序を設定することはできません。 – gigadot

+0

@gigadot:この順序は、Bean定義の順番で暗黙的です。 – skaffman

+0

場所3と4の間に違いはないということは間違いありません。私は質問と回答を更新しました。 Springは、 'mvc:default-servlet-handler'タグで設定されたハンドラマッピングに最低の優先順位を与えますが、明示的な値が設定されていない場合、他のハンドラマッピングにも同じ値を与えます。ご連絡ありがとうございます。 – gigadot

関連する問題