首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Spring MVC 靜態資源訪問 404 解決方案全解析:三種配置方式優劣對比

     編輯:Java 綜合教學

問題根源

當 DispatcherServlet 配置攔截 / 時:

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern> <!-- 攔截所有請求 -->
</servlet-mapping>

所有請求(包括 .js、.css、.jpg 等靜態資源)均進入 Spring MVC 分發流程,找不到對應 Controller 導致 404。

三種解決方案對比

方案一:web.xml 配置 DefaultServlet(Spring 3.0.4 前)

<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 映射之前 -->
  • 缺點:需逐個列舉靜態資源後綴,維護成本高,易遺漏。

方案二:<mvc:resources> 標籤(Spring 3.0.4+ 推薦)

<mvc:resources mapping="/css/**" location="/css/" cache-period="31556926" />
<mvc:resources mapping="/js/**" location="/js/" />
<mvc:resources mapping="/images/**" location="/images/" />
  • 原理:將 mapping 路徑註冊到 SimpleUrlHandlerMapping,由 ResourceHttpRequestHandler 處理靜態資源。
  • 優點:支持 Ant 路徑匹配、緩存控制、資源鏈、版本管理。
  • 前提:必須配置 <mvc:annotation-driven />,否則會報 No mapping found 警告。

方案三:<mvc:default-servlet-handler/>(最簡單)

<mvc:default-servlet-handler />
  • 原理:將 /** 註冊到 SimpleUrlHandlerMapping,委託容器默認 DefaultServlet 處理。
  • 優點:零配置,自動適配所有靜態資源。
  • 缺點:無法自定義緩存、壓縮、版本策略等高級功能。

HandlerMapping 優先級機制(關鍵知識)

HandlerMappingOrder 值說明
DefaultAnnotationHandlerMapping0優先匹配 Controller
<mvc:resources> 註冊的 SimpleUrlHandlerMapping2147483646靜態資源處理
<mvc:default-servlet-handler> 註冊的 SimpleUrlHandlerMapping2147483647最後兜底

Spring 按 order 升序嘗試匹配:先找 Controller,找不到再走靜態資源處理器,最後才走 DefaultServlet。這就是為什麼配置 *.do 等後綴的 DispatcherServlet 不會有此問題——靜態資源不匹配 *.do,直接由 DefaultServlet 處理。

最佳實踐建議

  1. 現代項目首選 <mvc:resources>,功能最豐富,支持資源鏈、緩存、壓縮、指紋版本。
  2. 簡單項目或快速原型可用 <mvc:default-servlet-handler/>。
  3. 避免使用方案一(web.xml 列舉後綴),已過時。
  4. 若 DispatcherServlet 映射 *.do,則無需額外配置靜態資源。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved