前提是圖片目錄已經放倒了WEB-INF外面,仍然是報錯404,如果是jsp資源,卻可以正確的解析。后來發現是spring mvc配置文件導致的。
,在配置文件中加上了
<mvc:default-servlet-handler />
再訪問就不再報錯了。
樓主查了一下這個配置的作用。
servlet在找頁面時,走的是dispatcherServlet路線。找不到的時候會報404
加上這個默認的servlet時候,servlet在找不到的時候會去找靜態的內容。
如何你的DispatcherServlet攔截 *.do這樣的URL,就不存在訪問不到靜態資源的問題。如果你的
DispatcherServlet攔截“/”,攔截了所有的請求,同時對*.js,*.jpg的訪問也就被攔截了。
目的:可以正常訪問靜態文件,不要找不到靜態文件報404。
方案一:激活Tomcat的defaultServlet來處理靜態文件
<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了
Tomcat, Jetty, JBoss, and GlassFish 默認 Servlet的名字 -- "default"
Google App Engine 默認 Servlet的名字 -- "_ah_default"
Resin 默認 Servlet的名字 -- "resin-file"
WebLogic 默認 Servlet的名字 -- "FileServlet"
WebSphere 默認 Servlet的名字 -- "SimpleFileServlet"
方案二 ,使用<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 是 匹 "/**"的,所以一定會匹配上,再響應圖片。