當 DispatcherServlet 配置攔截 / 時:
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern> <!-- 攔截所有請求 -->
</servlet-mapping>
所有請求(包括 .js、.css、.jpg 等靜態資源)均進入 Spring MVC 分發流程,找不到對應 Controller 導致 404。
<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 mapping="/css/**" location="/css/" cache-period="31556926" />
<mvc:resources mapping="/js/**" location="/js/" />
<mvc:resources mapping="/images/**" location="/images/" />
mapping 路徑註冊到 SimpleUrlHandlerMapping,由 ResourceHttpRequestHandler 處理靜態資源。<mvc:annotation-driven />,否則會報 No mapping found 警告。<mvc:default-servlet-handler />
/** 註冊到 SimpleUrlHandlerMapping,委託容器默認 DefaultServlet 處理。| HandlerMapping | Order 值 | 說明 |
|---|---|---|
| DefaultAnnotationHandlerMapping | 0 | 優先匹配 Controller |
| <mvc:resources> 註冊的 SimpleUrlHandlerMapping | 2147483646 | 靜態資源處理 |
| <mvc:default-servlet-handler> 註冊的 SimpleUrlHandlerMapping | 2147483647 | 最後兜底 |
Spring 按 order 升序嘗試匹配:先找 Controller,找不到再走靜態資源處理器,最後才走 DefaultServlet。這就是為什麼配置 *.do 等後綴的 DispatcherServlet 不會有此問題——靜態資源不匹配 *.do,直接由 DefaultServlet 處理。
*.do,則無需額外配置靜態資源。