1. 程式人生 > >Spring MVC靜態資源攔截(No mapping found for HTTP request with URI in DispatcherServlet with name ' ')問題

Spring MVC靜態資源攔截(No mapping found for HTTP request with URI in DispatcherServlet with name ' ')問題

程式載入或用瀏覽器訪問靜態資源時出現以下的警告:

No mapping found for HTTP request with URI [/] in DispatcherServlet with name ”

問題原因:預設的訪問的URL都會被DispatcherServlet所攔截,從web.xml下對spring mvc的DispatcherServlet請求url對映的配置可以看出,具體配置如下:

<servlet>
        <servlet-name>hello-dispatcher</servlet-name>
        <
servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/application.xml</param-value> </init-param> <load-on
-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>hello-dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
<url-pattern>/</url-pattern>

url-pattern使用的是/,而不是/,如果使用/,那麼請求時可以通過DispatcherServlet轉發到相應的Action或者Controller中的,但是返回的內容,如返回的jsp還會再次被攔截,這樣導致404錯誤,即訪問不到jsp。所以如果以後發現總是有404錯誤的時候,別忘了check一下 url-pattern的配置是否是/*.

那麼如何訪問自己需要的靜態資原始檔呢?
解決方案一(告訴spring 靜態資源的處理方式):

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

解決方案二:

<servlet>
        <servlet-name>hello-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/application.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello-dispatcher</servlet-name>
        <url-pattern>/.jsp</url-pattern>
    </servlet-mapping>

告訴spring mvc只攔截對於某一類檔案的請求,比如上面配置的只攔截對於字尾為jsp檔案的訪問。
解決方案三:

    <servlet>
        <servlet-name>hello-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/application.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.js</url-pattern>
    </servlet-mapping>

告訴spring mvc 對於字尾為js的檔案是可以訪問的。依次類推,需要訪問其他資原始檔時可以通過servlet-mapping追加。