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

SSM 框架整合實戰:徹底解決 CSS/JS 靜態資源被攔截無法加載的三大方案

     編輯:Java 綜合教學

SSM 框架整合實戰:徹底解決 CSS/JS 靜態資源被攔截無法加載的三大方案

在使用 SpringMVC + Spring + MyBatis (SSM) 搭建項目時,很多開發者都會遇到一個「看似詭異實則經典」的問題:Controller 請求正常、數據返回無誤,但頁面樣式全亂、JS 失效,瀏覽器 Network 面板顯示 CSS/JS 文件 404 或未請求到。路徑檢查無數遍沒錯,編碼也是 UTF-8,這時候往往是 DispatcherServlet 的攔截配置「過於激進」把靜態資源請求也攔截了。

核心原因剖析

SpringMVC 的前端控制器 DispatcherServlet 默認配置 `/` 會攔截所有請求(包含 `.css`、`.js`、`.png` 等靜態資源)。但 `DispatcherServlet` 只負責處理動態請求分發,無法處理靜態資源,導致請求進入 SpringMVC 後找不到對應 Handler,最終報 404。

方案一:在 web.xml 中激活容器默認 Servlet(推薦,最簡潔)

利用 Servlet 容器(如 Tomcat)自帶的 default Servlet 專門處理靜態資源請求,繞過 SpringMVC。

<!-- web.xml 中配置 -->
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/css/*</url-pattern>
    <url-pattern>/js/*</url-pattern>
    <url-pattern>/images/*</url-pattern>
    <url-pattern>/fonts/*</url-pattern>
</servlet-mapping>

注意: 若你的 Web 容器默認 Servlet 名稱不是 "default"(如 Jetty 可能不同),需在 SpringMVC 配置文件中顯式指定:

<mvc:default-servlet-handler default-servlet-name="你的容器默認Servlet名" />

方案二:修改 DispatcherServlet 的攔截路徑為具體後綴(傳統做法)

將攔截路徑從 `/` 改為 `*.action`、`.do` 或 `*.html` 等具體後綴,靜態資源請求自然不會進入 SpringMVC。

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.action</url-pattern> <!-- 僅攔截 .action 結尾的請求 -->
</servlet-mapping>

此時訪問地址需帶後綴:`https://localhost:8080/project/login.action`。缺點:RESTful 風格 URL 不再純粹,前後端分離項目不推薦。

方案三:使用 <mvc:resources> 映射靜態資源路徑(SpringMVC 標準方式)

在 SpringMVC 配置文件中聲明靜態資源映射,讓框架知道哪些路徑對應靜態文件目錄。

<!-- springmvc-servlet.xml -->
<mvc:resources mapping="/css/**" location="/static/css/" />
<mvc:resources mapping="/js/**" location="/static/js/" />
<mvc:resources mapping="/images/**" location="/static/images/" />
<mvc:annotation-driven /> <!-- 必須開啟註解驅動,否則 resources 可能不生效 -->

常見坑點:

  • 缺少 `` 導致配置不生效
  • `location` 路徑寫錯(需以 `/` 開頭,指向 `webapp` 或 `resources` 目錄下的實際路徑)
  • 多模塊項目中靜態資源打包未包含在 WAR/JAR 中

最佳實踐建議

  1. 新項目/前後端分離: 採用 方案一 + 方案三結合。`web.xml` 配 `default` Servlet 保底,SpringMVC 內配 `mvc:resources` 精準映射,支援 RESTful 風格 URL。
  2. 老項目維護: 若不想動 `web.xml`,優先嘗試方案三,確保 `` 存在。
  3. 生產環境: 建議由 Nginx 直接代理靜態資源,完全繞過 Java 進程,性能最優。

總結

靜態資源被攔截本質是 URL 映射衝突。理解 `DispatcherServlet`、`default Servlet`、靜態資源目錄三者關係,對症下藥即可輕松解決。記住:好的提問能事半功倍,直擊本質才能高效解決問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved