2013-05-16 22 views
2

我试图建立一个非常简单的基本配置为一个Spring的web应用程序,可以处理以下情况:如何在不中断资源映射的情况下隐式映射文件夹视图?

  • 地图资源的根请求/index,例如/映射到/index/resource/映射到/resource/index
  • 地图/static/**/static/(这是一个资源视图 - css,js,图像)
  • 处理一些具有控制器映射的特定请求路径
  • 所有其他请求映射到一个基于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的解决方案,我可以使用代码配置或混合解决方案。

回答

0

我设法通过实施我自己的ControllerConfig来找到解决方案。

视图-servlet.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; 
    } 

} 

魔术是在ViewConfig上设置适配器上的订单值。 Spring创建一个默认的映射处理程序,所有由组件扫描找到的RequestMapping被添加到。我最初设置失败的原因是这个处理程序的排序是在mvc:resources之前注册的。在mvc:resources之后创建我自己的适配器并设置其处理顺序,以使两者都可以工作。

有关这方面的信息可以在春季文档19.9.1 Setting up the dispatcher for annotation support中找到。

当然的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"/> 

更新:更改为RequestMappingHandlerMappingRequestMappingHandlerAdapterDefaultAnnotationHandlerMappingAnnotationMethodHandlerAdapter反映春季3.1.X及以上所做的更改。

相关问题