2

次のケースを処理できるSpring Webアプリケーションの非常に単純な基本構成をセットアップしようとしています:

  • リソース ルート リクエストを/indexにマップします。たとえば、 に/マップし/index、 に/resource/マップします。/resource/index
  • マップ/static/**/static/(これはリソース ビューです - css、js、images)
  • コントローラ マッピングを使用して特定のリクエスト パスを処理する
  • 他のすべてのリクエストを URL ベースのビューに/resource/pageマップします。/WEB-INF/views/resource/page.jsp

私の現在の構成では、次のとおりです。

<mvc:annotation-driven/>
<mvc:default-servlet-handler/>
<mvc:resources mapping="/static/**" location="/static/"/>
<mvc:view-controller path="/" view-name="index"/>

これは、静的リソースとルート リクエスト ( /) では機能しますが、リソース ベースのルート リクエスト ( /resource/) では機能しません。他のすべてのリクエスト ( **/) を処理しようとすると、静的リソースの処理が中断されます。

<mvc:view-controller path="**/*" />

これらすべてを同時に行う方法はありますか?xml のみのソリューションである必要はありません。コード構成またはハイブリッド ソリューションで問題ありません。

4

1 に答える 1

1

私は独自のControllerandを実装することで解決策を見つけることができましたConfig

ビューサーブレット.xml

<mvc:resources mapping="/static/**" location="/static/"/>
<context:component-scan base-package="com.example.web.view"/>

com.example.web.view.ViewConfig

@Configuration
public class ViewConfig {

    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver vr = new InternalResourceViewResolver();
        vr.setPrefix("/WEB-INF/views/");
        vr.setSuffix(".jsp");
        return vr;
    }

    @Bean RequestMappingHandlerMapping requestMappingHandlerMapping(){
        return new RequestMappingHandlerMapping();
    }

    @Bean RequestMappingHandlerAdapter requestMappingHandlerAdapter(){
        RequestMappingHandlerAdapter adapter = new RequestMappingHandlerAdapter();
        adapter.setOrder(2); //process after mvc:resources
        return adapter;
    }
}

com.example.web.view.ViewController

@Controller
public class ViewController {

    @RequestMapping(value = "**/")
    public String all(HttpServletRequest request) {     
        String path = request.getRequestURI().replace(request.getContextPath(),"");
        return path.endsWith("/") ? path +"index" : path;
    }

}

マジックは、アダプタで順序値を設定することでしたViewConfigRequestMappingSpring は、 component-scan によって見つかったすべての が追加されるデフォルトのマッピング ハンドラーを作成します。私の初期セットアップが失敗した理由は、このハンドラーの順序が によって登録されたハンドラーの前に一致することでしたmvc:resources。独自のアダプターを作成し、mvc:resources両方が機能するようにした後に処理する順序を設定します。

これに関する情報は、春のドキュメント19.9.1 注釈サポートのためのディスパッチャの設定 にあります。

もちろん、ViewConfig は純粋に xml で実装することもできます。

<mvc:resources mapping="/static/**" location="/static/"/>

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="order" value="2"/>
</bean>

<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/views/"/>
    <property name="suffix" value=".jsp"/>
</bean>

<context:component-scan base-package="com.example.web.view"/>

更新: Spring 3.1.x 以降で行われた変更を反映するために、 toRequestMappingHandlerMappingおよびRequestMappingHandlerAdapterfromDefaultAnnotationHandlerMappingに変更されました。AnnotationMethodHandlerAdapter

于 2013-05-17T02:12:17.883 に答える