靜態資源訪問不到緣由: 是web.xml下對spring的DispatcherServlet請求url映射的配置,原配置以下:css
<servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <span style="BACKGROUND-COLOR: #ffff33"><url-pattern>/</url-pattern> </span> </servlet-mapping>
分析緣由:<servlet-mapping>的<url-pattern>/</url-pattern>把全部的請求都交給spring去處理了,而全部available的請求url都是在Constroller裏使用相似@RequestMapping(value = "/login/{user}", method = RequestMethod.GET)這樣的註解配置的,這樣的話對js/css/jpg/gif等靜態資源的訪問就會得不到web
解決方法一: 激活Tomcat的defaultServlet來處理靜態文件spring
在web.xml裏添加以下配置安全
<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping>要配置多個,每種文件配置一個。
要寫在DispatcherServlet的前面, 讓defaultServlet先攔截,這個就不會進入Spring了。mvcTomcat, Jetty, JBoss, and GlassFish 默認 Servlet的名字 -- "default"
Google App Engine 默認 Servlet的名字 -- "_ah_default"
Resin 默認 Servlet的名字 -- "resin-file"
WebLogic 默認 Servlet的名字 -- "FileServlet"
WebSphere 默認 Servlet的名字 -- "SimpleFileServlet"app
解決方法二: 在spring3.0.4之後版本提供了mvc:resourceswebapp
<mvc:resources> 的使用方法:maven
<!--對靜態資源文件的訪問--> <mvc:resources mapping="/images/**" location="/images/" />/images /**映射到 ResourceHttpRequestHandler 進行處理,location指定靜態資源的位置.能夠是web application根目錄下、jar包裏面,這樣能夠把靜態資源壓縮到jar包中。cache-period可使得靜態資源進行web cache。url
若是出現下面的錯誤,多是沒有配置 <mvc:annotation-driven /> 的緣由。
報錯WARNING: No mapping found for HTTP request with URI [/mvc/user/findUser/lisi/770] in DispatcherServlet with name 'springMVC'spa使用 <mvc:resources/> 元素,把 mapping 的 URI 註冊到 SimpleUrlHandlerMapping的urlMap 中,key 爲 mapping 的 URI pattern值,而value爲 ResourceHttpRequestHandler,這樣就巧妙的把對靜態資源的訪問由 HandlerMapping 轉到ResourceHttpRequestHandler 處理並返回,因此就支持 classpath 目錄, jar 包內靜態資源的訪問.另外須要注意的一點是,不要對 SimpleUrlHandlerMapping 設置 defaultHandler. 由於對 static uri 的 defaultHandler 就是ResourceHttpRequestHandler,不然沒法處理static resources request.
mapping:映射
location:本地資源路徑,注意必須是webapp根目錄下的路徑。
兩個*,它表示映射resources/下全部的URL,包括子路徑(即接多個/)
陷阱:
配置的location必定要是webapp根目錄下才行,若是你將資源目錄,放置到webapp/WEB-INF下面的話,則就會訪問失敗。這個問題經常會犯。
錯誤方式:WEB-INF目錄做用
WEB-INF是Java的WEB應用的安全目錄。所謂安全就是客戶端沒法訪問,只有服務端能夠訪問的目錄。
若是想在頁面中直接訪問其中的文件,必須經過web.xml文件對要訪問的文件進行相應映射才能訪問。
固然,你非要放在WEB-INF中,則必須修改resources映射,如:<span style="BACKGROUND-COLOR: #ffff33"><mvc:resources mapping="/js/**" location="/WEB-INF/js/" /></span>推薦方式:maven項目的目錄結構爲以下圖所示 。
解決方法三: 使用<mvc:default-servlet-handler/>
<mvc:default-servlet-handler/>會把 "/**" url,註冊到 SimpleUrlHandlerMapping 的 urlMap 中,把對靜態資源的訪問由 HandlerMapping 轉到 org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler 處理並返回.DefaultServletHttpRequestHandler 使用就是各個 Servlet 容器本身的默認 Servlet.
補充說明:多個HandlerMapping的執行順序問題:
DefaultAnnotationHandlerMapping 的 order 屬性值是:0
<mvc:resources/ >自動註冊的 SimpleUrlHandlerMapping 的 order 屬性值是: 2147483646
<mvc:default-servlet-handler/>自動註冊的 SimpleUrlHandlerMapping 的 order 屬性值是:2147483647
spring 會先執行 order 值比較小的。當訪問一個 a.jpg 圖片文件時,先經過 DefaultAnnotationHandlerMapping 來找處理器,必定是找不到的,咱們沒有叫 a.jpg 的 Action。再按 order 值升序找,因爲最後一個 SimpleUrlHandlerMapping 是匹配 "/**" 的,因此必定會匹配上,再響應圖片。最後再說明一下,如何你的 DispatcherServlet 攔截 *.do 這樣的 URL,就不存上述問題了