DispatcherServlet 映射為 / 時會攔截所有請求(含 .css/.js/.png),導致:
@RequestMapping 拋 404<beans xmlns="https://www.springframework.org/schema/beans"
xmlns:mvc="https://www.springframework.org/schema/mvc"
xsi:schemaLocation="
https://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 必須:啟用 @RequestMapping 等註解驅動 -->
<mvc:annotation-driven/>
<!-- 靜態資源映射:** 表示遞歸所有子目錄 -->
<mvc:resources mapping="/css/**" location="/bootstrap-3.3.5-dist/css/"/>
<mvc:resources mapping="/js/**" location="/bootstrap-3.3.5-dist/js/"/>
<mvc:resources mapping="/images/**" location="/img/"/>
<mvc:resources mapping="/fonts/**" location="/fonts/"/>
<!-- 必須:讓容器預設 Servlet 處理靜態資源,繞過 DispatcherServlet -->
<mvc:default-servlet-handler/>
| 瀏覽器請求 | 映射規則 | 實際磁碟路徑 |
|---|---|---|
| /css/bootstrap.min.css | /css/** → /bootstrap-3.3.5-dist/css/ | webapp/bootstrap-3.3.5-dist/css/bootstrap.min.css |
| /js/app/main.js | /js/** → /bootstrap-3.3.5-dist/js/ | webapp/bootstrap-3.3.5-dist/js/app/main.js |
<link href="/MyWeb/css/bootstrap.min.css" rel="stylesheet">
c:url 動態生成(推薦)<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
<link href="<c:url value='/css/bootstrap.min.css' />" rel="stylesheet">
<script src="<c:url value='/js/app/main.js' />"></script>
優點:自動補上 contextPath,專案重命名/部署到根路徑皆無需改碼。
# application.yml
spring:
mvc:
static-path-pattern: /static/**
resources:
static-locations: classpath:/static/,classpath:/public/,classpath:/resources/,classpath:/META-INF/resources/
預設將 src/main/resources/static 映射為 /static/**,零配置即用。
| 現象 | 可能原因 | 解決 |
|---|---|---|
| 靜態資源 404 | 缺少 mvc:default-servlet-handler | 加上該標籤,或確認容器 web.xml 有 DefaultServlet |
| Controller 失效 | mvc:resources 映射順序搶先 | 確保 mvc:annotation-driven 在前,資源映射具體路徑優先 |
| CSS/JS 相對路徑圖片 404 | CSS 內 url(../img/x.png) 相對編譯後路徑 | 使用 url(/images/x.png) 絕對路徑或配置 mvc:resources 映射 images |
| 快取不更新 | 瀏覽器/代理快取 | 啟用 ResourceUrlEncodingFilter + 版本號 /css/app.css?v=20240118 |