jakarta.servlet.ServletException:java.lang.NoClassDefFoundError:javax / servlet / jsp / tagext / TagLibraryValidator 另请参见:

问题描述

我正在尝试使用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>  

解决方法

Jakarta EE 9版本的JSTL可作为JSTL 2.0 here获得。

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

这是JSTL 2.0的参考实现,目前在GlassFish 6.0中也使用了JSTL 2.0(最初来自Sun,然后由Oracle拥有,然后由Eclipse拥有)。通常,Apache也有其自己的实现,但是它不能作为JSTL 2.0使用(还可以吗?)。

是的,它仍处于里程碑阶段。将来,最终版本将以2.0.0的形式提供(没有-M1)。

如果您未使用诸如Maven之类的依赖项管理工具,但仍在手动携带松散的JAR文件,则here是直接下载链接。只需确保它最终以已部署的WAR文件的/WEB-INF/lib文件夹结尾即可,就像那些依赖项管理工具会自动执行的一样。不,除了此文件之外,您绝对不需要。肯定不是来自JSTL 1.x的。

为了完整起见并进行确认, JSTL 2.0 still的taglib URI引用了原始java.sun.com主机,而您直觉上希望它也将被迁移到xmlns.jcp.org甚至是jakarta.ee

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

另请参见:

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...