如何在项目中使用JSTL

How to use JSTL in a project

我正在尝试在我的项目中使用 jstl,但是当 运行 TomCat 10 上的应用程序时我遇到了以下问题:

说明:服务器遇到意外情况,无法完成请求。

异常:

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

我添加了jstl.jarstandard.jarjst-impl.jarjstl-standar.jarjstl-api-1.2.jar(根据不同教程),但其中 none 解决了问题。

研究第一行错误信息。在左侧,请注意 jakarta.。在右侧,注意 javax..

Java EE雅加达 EE

几年前,Oracle transferred ownership and control of the Java Enterprise Edition (Java EE) specifications and technologies to the Eclipse Foundation. Thus, Java EE became Jakarta EE. The trademark Java is owned by Oracle Corp.,因此必须从 Eclipse 基金会生产的新工件中删除该术语。

作为交接过渡的一部分,包命名从 javax.* 更改为 jakarta.*

您正在使用 Apache Tomcat v 10 版本,专为 jakarta.* 包命名而构建。 Tomcat 社区正在并行开发另一个版本,相同的功能,相同的性能,不同的包命名。

所以你有两个选择:

  • 继续使用 Tomcat10,同时将 import 语句更改为使用 jakarta.* 包命名。
  • 切换到使用 Tomcat 9,同时将 import 语句保持为 javax.*.

如果你的项目是全新的,或者是小而简单的,那么我推荐第一个。这样你就是 future-ready。除了在 copy-pasting 代码或阅读旧文章时记住调整包命名之外没有任何缺点。

另一个好处是最新版本的 Jakarta EE 实现支持 Java 11(必需)并支持 Java 17(可选,但通常已完成)。为此,选择 Tomcat 10.1.x 而不是 10.0.x。请参阅 Tomcat 文档,Which Tomcat?

如果您的项目已经存在并且很大,那么您可能希望推迟转换的工作。在这种情况下,坚持 Tomcat 9. 我怀疑你最终会想要过渡,但你可能会推迟几年。

顺便说一下,Tomcat、Eclipse Jetty 的同等竞争对手也选择了相同的方法。 Jetty 开发正在两个并行版本中完成,具有相同的功能、相同的性能、不同的包命名。


在这个 Oracle-to-Eclipse 过渡期间,现在有点令人困惑。为了帮助您熟悉方向,您可以在 YouTube 等平台上观看许多视频演示,包括一些由 Jakarta EE 项目本身发布的视频演示。

我建议您使用 Maven 来更轻松地添加依赖项,或者将来如果您想从您的个人计算机切换到其他计算机,您应该需要 copy/paste 外部库。


解决你不使用maven的问题:

  1. 确保您的库位于 WebContent -> WEB-INF -> lib 文件夹中。
  2. 有较新版本的JSTL 2.0 尝试切换到它。为此,您将需要这些文件:
    • jakarta.servlet.jsp.jstl-2.0.0.jar(这是EE4J的JSTL 2.0实现).
    • jakarta.servlet.jsp.jstl-api-2.0.0.jar(这是JSTL 2.0 API).

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