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

SpringMVC JstlView 配置導致 javax.servlet.jsp.jstl.core.Config 類找不到異常排查

     編輯:Java 綜合教學

SpringMVC JstlView 配置導致 javax.servlet.jsp.jstl.core.Config 類找不到異常排查

一、 現象:啟動拋 ClassNotFoundException

java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.Config
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1854)
    ...
    at org.springframework.web.servlet.view.JstlView.exposeHelpers(JstlView.java:135)

二、 根因:JstlView 硬依賴 JSTL API,但項目未引入或版本衝突

SpringMVC 的 InternalResourceViewResolver 默認視圖類為 InternalResourceView。若顯式設置 viewClass=JstlView,框架會在渲染前調用 JstlView.exposeHelpers(),該方法**靜態引用** javax.servlet.jsp.jstl.core.Config 類以暴露 JSTL 國際化/格式化配置上下文。

// JstlView.java 片段
protected void exposeHelpers(HttpServletRequest request) throws Exception {
    // 這行導致類加載,若 classpath 無 JSTL API 則拋 CNFE
    Config.get(request, Config.FMT_LOCALE); 
    ...
}

三、 觸發場景

  1. 配置了 viewClass=org.springframework.web.servlet.view.JstlView。
  2. 項目**未引入 JSTL API 依賴** (如 javax.servlet:jstl 或 org.glassfish.web:jakarta.servlet.jsp.jstl)。
  3. 或引入了 **JSTL 實現 (如 org.apache.taglibs:taglibs-standard-impl) 但缺 API 模塊**。
  4. 或 **Servlet 容器 (Tomcat/Jetty) 未提供 JSTL**,且項目未打包 (嵌入式容器常見)。

四、 解決方案 (按推薦度排序)

方案 1:移除 viewClass 配置,回退默認 InternalResourceView (最簡潔 ✅)

原理: InternalResourceView 不依賴 JSTL API,直接轉發到 JSP,由容器 JSP 引擎處理標籤庫。

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
    <!-- 刪除 viewClass 配置 -->
</bean>

適用: 絕大多數傳統 JSP 項目,**無需顯式指定 JstlView**,容器自動處理 JSTL 標籤。

方案 2:補全 JSTL API 依賴 (若確需 JstlView 功能)

Servlet 3.0+ / Jakarta EE 9+ (Tomcat 10+, Jetty 11+, Spring Boot 3+)
<dependency>
    <groupId>jakarta.servlet.jsp.jstl</groupId>
    <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
    <version>2.0.0</version>
</dependency>
<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>jakarta.servlet.jsp.jstl</artifactId>
    <version>2.0.0</version>
</dependency>
Servlet 2.5/3.x / Java EE (Tomcat 9-, Spring Boot 2-)
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>
<dependency>
    <groupId>org.apache.taglibs</groupId>
    <artifactId>taglibs-standard-impl</artifactId>
    <version>1.2.5</version>
</dependency>

方案 3:確保嵌入式容器包含 JSTL (Spring Boot 內嵌 Tomcat/Jetty)

Spring Boot Starter Web 默認**不包含 JSTL**,需額外添加:

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope> <!-- 內嵌容器提供 -->
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
</dependency>

五、 為什麼不建議使用 JstlView?

維度InternalResourceView (默認)JstlView
依賴無額外依賴強依賴 JSTL API Jar
功能單純轉發/包含暴露 JSTL Config 給請求屬性 (i18n/fmt)
適用性所有 JSP 項目需程序化控制 JSTL 區域/格式化配置時
風險無類加載失敗、Jar 衝突、版本遷移斷裂

除非你在 Controller 中動態設置 Config.set(request, Config.FMT_LOCALE, locale) 等**程序化覆蓋 JSTL 全局配置**,否則**完全不需要 JstlView**。

六、 遷移 Jakarta EE 9+ (javax → jakarta) 避坑

  • Spring Boot 3 / Spring Framework 6 / Tomcat 10+ 全面遷移包名 javax.* → jakarta.*。
  • JSTL 類變為 jakarta.servlet.jsp.jstl.core.Config。
  • 若舊代碼硬編碼 import javax.servlet.jsp.jstl.core.Config,**必須同步修改導包**,否則編譯/運行雙重失敗。
  • 建議:移除 viewClass 配置,避免業務代碼耦合 JSTL API 版本變更。

七、 總結

ClassNotFoundException: javax.servlet.jsp.jstl.core.Config 異常本質是 **SpringMVC JstlView 類對 JSTL API 的硬依賴**,而項目 classpath 缺失對應 Jar。最佳修復:刪除 viewClass=JstlView 配置,使用默認 InternalResourceView。若業務確需程序化控制 JSTL 國際化/格式化上下文,則按 Servlet 版本補全 jakarta.servlet.jsp.jstl-api + 實現或 javax.servlet:jstl + taglibs-standard-impl 依賴。技術選型原則:**能用默認約定解決的,不要顯式配置引入額外依賴風險**。

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