1. 程式人生 > >Spring mvc中不能引入js等靜態檔案問題的解決方案

Spring mvc中不能引入js等靜態檔案問題的解決方案

No mapping found for HTTP request with URI [/.../script/jquery-3.1.0.min.js] in DispatcherServlet with name 'springDispatcherServlet'

分析一下為什麼會有這樣的問題:

首先看一下springDispatcherServlet的配置

	<servlet>
		<servlet-name>springDispatcherServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:springmvc.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<!-- Map all requests to the DispatcherServlet for handling -->
	<servlet-mapping>
		<servlet-name>springDispatcherServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

這裡的url-pattern 配置是/  所以SpringMVC 會捕獲WEB 容器的所有請求,包括靜態資源的請求,SpringMVC會將他們當作一個普通請求去找對應的處理器,因找不到導致了報錯

但是你去修改這個url-pattern 配置又不符合 REST資源URL的風格,因為REST 是不希望出現帶.html 或者.do 之類的字尾,所以只能另尋途徑

開啟SpringMVC 的配置檔案,新增以下兩個配置

	<mvc:default-servlet-handler />

	<mvc:annotation-driven></mvc:annotation-driven>

起作用的是<mvc:default-servlet-handler /> 

default-servlet-handler 將在 SpringMVC 上下文中定義一個 DefaultServletHttpRequestHandler, 它會對進入 DispatcherServlet 的請求進行篩查, 如果發現是沒有經過對映的請

求, 就將該請求交由 WEB 應用伺服器預設的Servlet 處理. 如果不是靜態資源的請求,才由 DispatcherServlet 繼續處理

一般 WEB 應用伺服器預設的 Servlet 的名稱都是 default.

    <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
若所使用的 WEB 伺服器的預設 Servlet 名稱不是 default,則需要通過 default-servlet-name 屬性顯式指定

這裡還需要注意的是靜態資原始檔的位置,靜態資源需要放在WebContent 目錄下,如果放在WebContent /WEN-INF 目錄下,就算配置了上述配置,那也會出現404 錯誤,而

且這時候Tomcat 會由於上述配置的原因不發出警告的