jakarta.servlet.ServletException:java.lang.NoClassDefFoundError:javax / servlet / jsp / tagext / TagLibraryValidator

问题描述 投票:0回答:4

我尝试使用 JSTL 执行 JSP,但无法执行。我有 Apache Tomcat 10,即

jakarta.servlet.*
而不是
javax.servlet.*
。因此,每当我使用 JSTL 1.2.5 文件执行 Web 应用程序时,我都会收到错误:

jakarta.servlet.ServletException: java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/TagLibraryValidator
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
    at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:778)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

我尝试在网上找到已解决的类似问题/疑问,但未能找到。如何在 Tomcat 10 中使用 JSP 中的 JSTL?

我的索引JSP文件代码:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<html>  
  <head>  
    <title>Tag Example</title>  
  </head>  
  <body>  
    <c:out value="${'Hello Yo'}"/> 
  </body>  
</html>  
jsp tomcat jstl jakarta-migration
4个回答
18
投票

Jakarta EE 9 / Servlet 5.0 兼容版本的 JSTL 可作为 JSTL 2.0 此处

<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>jakarta.servlet.jsp.jstl</artifactId>
    <version>2.0.0</version>
</dependency>

这是 JSTL 2.0 的参考实现,目前也在 GlassFish 6.0 中使用(最初来自 Sun,后来归 Oracle 所有,然后归 Eclipse 所有)。通常 Apache 也有自己的实现,但它还没有作为 JSTL 2.0 提供(还?)。

为了完整起见,并确认一下,yes JSTL 2.0 的 taglib URI still 引用了原始

java.sun.com
主机,而您直观地期望它也会迁移到
xmlns.jcp.org
甚至
jakarta.ee

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

如果您已经使用 Jakarta EE 10 / Servlet 6.0(例如 Tomcat 10.1.x 而不是 Tomcat 10.0.x),请改用 JSTL 3.0

<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>jakarta.servlet.jsp.jstl</artifactId>
    <version>3.0.1</version>
</dependency>

在此版本中,taglib URI 已从 URL 形式更改为 URN 形式,如下所示:

<%@ taglib uri="jakarta.tags.core" prefix="c" %>

另请参阅:


6
投票

对于您的配置,您将需要这两个文件才能使 JSTL 正常工作:

如果将它们放在项目的 lib 文件夹中,那么它只适用于该应用程序。因此,我建议您将它们放在 TomCat 应用程序的 lib 文件夹中 (.../apache-tomcat-10.0.6/lib/) 以及其他 jar 文件中。

这个是一个很好的话题,详细讨论了这个问题。


0
投票

对于那些像我一样曾经迷失过的人:你需要下载最新版本的taglibsjslt(以及它们的依赖项)!

事情是这样的:

  1. 从 Apache 下载 Tomcat 10 的最新标签库

  2. 下载最新的 jslt 和依赖项 - 除了 jakarta.servlet-api-5.0.0.jar(这就是原因

  3. 将下载的 JAR 移动到项目 WEB-INF/lib 文件夹中,该文件夹应如下所示:

.
+-- _WEB-INF
|   +-- lib
|       +-- jakarta.activation-2.0.0.jar
|       +-- jakarta.el-api-4.0.0.jar
|       +-- jakarta.servlet.jsp.jstl-2.0.0.jar
|       +-- jakarta.servlet.jsp.jstl-api-2.0.0.jar
|       +-- jakarta.xml.bind-api-3.0.0.jar
|       +-- taglibs-standard-compat-1.2.5.jar
|       +-- taglibs-standard-impl-1.2.5.jar
|       +-- taglibs-standard-spec-1.2.5.jar


0
投票

我也遇到了类似的问题:我使用tomcat v10.1

这是您必须下载的以下 jar 文件:

jakarta.servlet.jsp.jstl-2.0.0.jar

jakarta.servlet.jsp.jstl-api-2.0.0.jar

下载上面两个jar文件并将其添加到您的项目库文件夹中

© www.soinside.com 2019 - 2024. All rights reserved.