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)
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);
...
}
viewClass=org.springframework.web.servlet.view.JstlView。javax.servlet:jstl 或 org.glassfish.web:jakarta.servlet.jsp.jstl)。org.apache.taglibs:taglibs-standard-impl) 但缺 API 模塊**。原理: 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 標籤。
<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>
<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>
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>
| 維度 | InternalResourceView (默認) | JstlView |
|---|---|---|
| 依賴 | 無額外依賴 | 強依賴 JSTL API Jar |
| 功能 | 單純轉發/包含 | 暴露 JSTL Config 給請求屬性 (i18n/fmt) |
| 適用性 | 所有 JSP 項目 | 需程序化控制 JSTL 區域/格式化配置時 |
| 風險 | 無 | 類加載失敗、Jar 衝突、版本遷移斷裂 |
除非你在 Controller 中動態設置 Config.set(request, Config.FMT_LOCALE, locale) 等**程序化覆蓋 JSTL 全局配置**,否則**完全不需要 JstlView**。
javax.* → jakarta.*。jakarta.servlet.jsp.jstl.core.Config。import javax.servlet.jsp.jstl.core.Config,**必須同步修改導包**,否則編譯/運行雙重失敗。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 依賴。技術選型原則:**能用默認約定解決的,不要顯式配置引入額外依賴風險**。