2013-05-16 47 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及以上所做的更改。

相關問題