ChatGPT解决这个技术问题 Extra ChatGPT

如何安装 JSTL?绝对uri:http://java.sun.com/jstl/core 无法解析

我不知道我做错了什么,但我不能包括 JSTL。我有 jstl-1.2.jar,但不幸的是我得到了异常:

org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application
    at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:51)
    at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:409)
    at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:116)
    at org.apache.jasper.compiler.TagLibraryInfoImpl.generateTLDLocation(TagLibraryInfoImpl.java:315)
    at org.apache.jasper.compiler.TagLibraryInfoImpl.<init>(TagLibraryInfoImpl.java:148)
    at org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:429)
    at org.apache.jasper.compiler.Parser.parseDirective(Parser.java:492)
    at org.apache.jasper.compiler.Parser.parseElements(Parser.java:1439)
    at org.apache.jasper.compiler.Parser.parse(Parser.java:137)
    at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:255)
    at org.apache.jasper.compiler.ParserController.parse(ParserController.java:103)
    at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:170)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:332)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:312)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:299)
    at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:586)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
    at java.lang.Thread.run(Thread.java:619)

我有:

pom.xml javax.servlet servlet-api 2.5 provided < groupId>javax.servlet.jsp jsp-api 2.1 provided taglibs standard 1.1.2 javax.servlet jstl 1.2< /版本>

web.xml

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

我不得不在 jstl 旁边添加 taglibs depdendency 并且刚刚工作。

B
BalusC

org.apache.jasper.JasperException:绝对 uri:http://java.sun.com/jstl/core 无法在 web.xml 或随此应用程序部署的 jar 文件中解析

该 URI 用于 JSTL 1.0,但您实际上使用的是 JSTL 1.2,它使用带有附加 /jsp 路径的 URI(因为发明 EL 表达式的 JSTL 自 1.1 版以来已集成为 JSP 2.0 的一部分(早在 2001 年发布) !),以便在纯 JSP 中共享/重用 EL 逻辑)。

因此,根据 JSTL documentation 相应地修复 taglib URI:

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

此外,您需要绝对确定不会将多个不同版本的 JSTL JAR 文件一起放入运行时类路径中。这是 Tomcat 用户中很常见的错误。 Tomcat 的问题在于它不提供开箱即用的 JSTL,因此您必须手动安装它。这在普通 Jakarta EE 服务器中不是必需的。另请参阅What exactly is Java EE?

在您的特定情况下,您的 pom.xml 基本上告诉您 jstl-1.2.jar 和 standard-1.1.2.jar 在一起。这是错误的。您基本上是在混合来自 Oracle 的 JSTL 1.2 API+impl 和来自 Apache 的 JSTL 1.1 impl。您应该只使用一种 JSTL 实现,并且 API 版本必须与 impl 版本匹配。

在 Tomcat 10+ 上安装 JSTL

如果您已经使用 Tomcat 10 或更高版本(第一个 Jakartified 版本,使用 jakarta.* 包而不是 javax.* 包),请通过此 sole 依赖项使用 JSTL 2.0:

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

非 Maven 用户可以通过将以下两个物理文件放入 Web 应用程序项目的 /WEB-INF/lib 文件夹中来实现相同目的(绝对不要将标准 *.jar 或任何松散的 .tld 文件放入其中!必要时将其删除)。

jakarta.servlet.jsp.jstl-2.0.0.jar(这是 EE4J 的 JSTL 2.0 impl)

jakarta.servlet.jsp.jstl-api-2.0.0.jar(这是 JSTL 2.0 API)

在 Tomcat 9 上安装 JSTL-

如果您还没有使用 Tomcat 10,但仍使用 Tomcat 9 或更早版本,请通过此唯一依赖项使用 JSTL 1.2(这与 Tomcat 9 / 8 / 7 / 6 / 5 兼容,但不是更早版本):

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

非 Maven 用户可以通过将以下两个物理文件放入 Web 应用程序项目的 /WEB-INF/lib 文件夹中来实现相同目的(绝对不要将标准 *.jar 或任何松散的 .tld 文件放入其中!必要时将其删除)。

jakarta.servlet.jsp.jstl-1.2.6.jar(这是 EE4J 的 JSTL 1.2 impl)

jakarta.servlet.jsp.jstl-api-1.2.7.jar(这是 JSTL 1.2 API)

在普通 JEE 服务器上安装 JSTL

如果您实际上使用的是普通的 Jakarta EE 服务器,例如 WildFly、Payara、TomEE、GlassFish、WebSphere、OpenLiberty、WebLogic 等,而不是准系统 servlet 容器,例如 Tomcat、Jetty、Undertow 等,那么您执行根本不需要显式安装 JSTL。普通的 Jakarta EE 服务器已经提供开箱即用的 JSTL。换言之,您无需将 JSTL 添加到 pom.xml,也无需将任何 JAR/TLD 文件放入 webapp。仅 provided 范围的 Jakarta EE 坐标就足够了:

<dependency>
    <groupId>jakarta.platform</groupId>
    <artifactId>jakarta.jakartaee-api</artifactId>
    <version><!-- 9.1.0, 9.0.0, 8.0.0, etc depending on your server --></version>
    <scope>provided</scope>
</dependency>

确保 web.xml 版本正确

此外,您还应该确保您的 web.xml 被声明为符合至少 Servlet 2.4,因此不是 Servlet 2.3 或更早版本。否则 JSTL 标记内的 EL 表达式将依次失效。选择与您的目标容器匹配的最高版本,并确保您的 web.xml 中没有 <!DOCTYPE>,否则仍会触发 Servlet 2.3 模式。这是一个与 Servlet 5.0 (Tomcat 10) 兼容的示例:

<?xml version="1.0" encoding="UTF-8"?>
<web-app 
    xmlns="https://jakarta.ee/xml/ns/jakartaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
    version="5.0">

    <!-- Config here. -->

</web-app>

这是一个与 Servlet 4.0 (Tomcat 9) 兼容的示例:

<?xml version="1.0" encoding="UTF-8"?>
<web-app
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    version="4.0">

    <!-- Config here. -->

</web-app>

也可以看看:

JSTL 核心 taglib 文档(用于正确的 taglib URI)

EL 表达式不在 JSP 中求值

如何为 Tomcat 10+ 或 Tomcat 9- 配置 pom.xml


我已更改为 /jsp 并且: org.apache.jasper.JasperException: The absolute uri: java.sun.com/jsp/jstl/core cannot be resolve in either web.xml ....
我真的很喜欢你放在一起的 JSTL wiki 页面。然而,由于这个问题是谷歌针对特定错误消息的热门问题,我冒昧地对其进行编辑并注意“非 jsp”URI 来自 JSTL 1.0。
@TheJeed:JSTL wiki 页面中有更多可用链接。
如果您使用 Gradle,请添加此依赖项:compile('javax.servlet:jstl:1.2')
Intelij IDEA 中的@BalusC 在完成您提到的代码后,代码工作正常,但行 http://java.sun.com/jsp/jstl/core<c:forEach> 以红色表示,编辑器显示无法解决它们的错误。如何解决?在 IDEA
S
Stephen P

@BalusC 是完全正确的,但是如果你仍然遇到这个异常,那说明你做错了什么。您可以在 SO JSTL Tag Info 页面上找到最重要的信息。

基本上,这是处理此异常所需要做的事情的摘要。

检查 web.xml 中的 servlet 版本: 检查此 servlet 版本是否支持 JSTL 版本: Servlet 2.5 版使用 JSTL 1.2 或 Servlet 2.4 版使用 JSTL 1.1 您的 servlet 容器必须具有适当的库,或者您必须手动将其包含在您的应用程序中。例如:JSTL 1.2 需要 jstl-1.2.jar

如何处理 Tomcat 5 或 6:

您需要将适当的 jar 包含到您的 WEB-INF/lib 目录中(它只适用于您的应用程序)或 tomcat/lib(将适用于所有应用程序全局)。

最后一件事是您的 jsp 文件中的 taglib。对于 JSTL 1.2,正确的是:

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

我注意到这个问题很受欢迎(很多观众)。所以这就是为什么我决定写一个简短的教程来处理这个问题
G
Gary Sheppard

我发现了此类错误的另一个原因:在我的例子中,有人将 conf/catalina.properties 设置 tomcat.util.scan.StandardJarScanFilter.jarsToSkip 属性设置为 * 以避免记录警告消息,从而跳过了 Tomcat 的必要扫描。将此更改回 Tomcat 默认值并添加适当的 jar 列表以跳过(不包括 jstl-1.2 或 spring-webmvc)解决了该问题。


是的!。我也是。有人(=我自己)在某个时候将 tomcat.util.scan.StandardJarScanFilter.jarsToSkip=* 放入 catalina.properties 文件中(被误解了?)试图加快 Tomcat 的启动时间。啊!
我使用以下脚本创建一个 jarsToSkip 列表,该列表避免了 TLD 和网络片段 jar:pastebin.com/3Bfm1u6K
如果您不想更改您的 jarsToSkip 设置,则在其下方有一个 jarsToScan 设置会覆盖 jarsToSkip 中的任何内容。我们最终将 taglibs*.jar 添加到 jarsToScan,因为我们的标记库是 taglibs-standard-impl-1.2.5.jartaglibs-standard-spec-1.2.5.jar
这是对我有用的答案。在 conf/catalina.properties 中,我将 tomcat.util.scan.StandardJarScanFilter.jarsToSkip=*.jar 更改为 tomcat.util.scan.StandardJarScanFilter.jarsToScan=jstl*.jar 并修复了它。
与此类似,可能在 META-INF/context.xml 中使用 禁用了 jar 扫描。
B
Bhaskara Arani

下载 jstl-1.2.jar 将此指令添加到您的页面: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 将 JAR 文件粘贴到您的 WEB -INF/lib 文件夹。这应该有效。 (它对我有用。)


G
Gray
jstl-1.2.jar --> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
jstl-1.1.jar --> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>

还请检查您是否在 WEB-INF/lib 文件夹中添加了 javax.servlet.jarjavax.servlet.jsp.jstl-1.2.1.jar 的依赖项 jar。就我而言,这两个解决了这个问题。


你能看看这里的问题吗[stackoverflow.com/questions/44039706/…
H
Hadi Rasouli

jstl-1.2.jar 添加到 tomcat/lib 文件夹中。

这样,您的依赖错误将再次得到修复。


J
JohnEye

2021年的答案

这个问题仍然很受欢迎,但所有答案都严重过时了。所有 Java EE 组件都被拆分为多个 Jakarta 项目,JSTL 也不例外。因此,截至今天,这里是正确的 Maven 依赖项:

<dependency>
    <groupId>jakarta.servlet.jsp.jstl</groupId>
    <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
    <version>1.2.7</version>
</dependency>
<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>jakarta.servlet.jsp.jstl</artifactId>
    <version>1.2.6</version>
</dependency>

是的,版本和 groupId 不匹配,但这是一个 quirk of the project's current state


是的,但这并不能解决我的问题,但是关闭,使用 tomcat10,您需要两个库 * taglibs-standard-impl-1.2.5-migrated-0.0.1.jar * taglibs-standard-spec-1.2.5-migrated- 0.0.1.jar 这个库可以从 tomcat10 示例 webapps 中检索,也不要扫描 taglibs-standard* 因为 tld 文件在那里,这可以在 webapp META-CONF 库中的 context.xml 中禁用
M
Meyer

我只是想添加我为这个问题找到的修复程序。我不确定为什么会这样。我有正确版本的 jstl (1.2) 以及正确版本的 servlet-api (2.5)

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

我的页面中也有正确的地址,如该线程中所建议的那样,即

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

为我解决此问题的方法是从我的 pom 中的 xml 文件中删除我的 jstl 1.2 依赖项的范围标记。再次不确定为什么要修复它,但以防万一有人正在用 JPA 和 Hibernate 教程在复数视觉上做 spring 并以这种方式设置他们的 pom,请尝试删除范围标签并查看是否修复它。就像我说的那样,它对我有用。


L
LoBo

我已经提到 pom.xml 中的 Maven 依赖项是错误的。它应该是

    <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>

有趣的是,当我在 maven 中搜索 jstl 时,我发现自己处于:mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl/1.2 您是如何找到这种依赖关系的?
A
Abd Abughazaleh

2022 年最可能的解决方案

- 缺少库:下载库 jstl/1.2Java Servlet API » 4.0.1

2 - 将这些库添加到您的 项目tomcat/lib 文件夹中。

3 - 添加:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 页面的第一行。

4 - 如果您使用的是 maven,请将以下内容添加到 pom.xml 文件中:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

R
Reinderien

我完全禁用了 MAVEN 和 Spring 工具。而且我必须添加以下 jar 以使我的环境正常工作。

spring-aop-4.0.3.RELEASE.jar

spring-beans-4.0.3.RELEASE.jar (很难找到这个修复,其他 org.springframework<3.versions> 只是没有工作。

spring-context-4.0.3.RELEASE.jar

spring-core-4.0.3.RELEASE.jar

spring-expression-4.0.3.RELEASE.jar

spring-web-4.0.3.RELEASE.jar

spring-webmvc-4.0.3.RELEASE.jar

jstl-1.2.jar

最糟糕的是 jstl-api-1.2.jarjavax-servlet.jsp.jst-api-1.2.1.jar。他们只是没有工作。

jstl-1.2.jar 运行良好。


+1 在我的头撞到墙上几个小时后,使用 jstl-1.2 而不是 jstl-1.2.1 也对我有用,我不知道为什么。
A
Askar

如果您使用 Spring boot,请考虑从 Application.properties 中删除 server.tomcat.additional-tld-skip-patterns=*.jar(如果有)


w
w3Charlie

刚刚在 Eclipse 中遇到了类似的问题,修复了:

rightclick on project->Properties->Deployment Assembly->add Maven Dependencies

在我编辑我的 pom.xml 时,之前有什么东西把它踢了出来

我有所有需要的 jar 文件,taglib uri 和 web.xml 没问题


不知道为什么你没有得到爱,这是正确的解决方案
G
Gray

这个问题中的所有答案都对我有帮助,但我想我会为后代添加一些额外的信息。

原来我对 gwt-test-utils 有一个测试依赖项,它引入了 gwt-dev 包。不幸的是,gwt-dev 包含 Jetty、JSP、JSTL 等的完整副本,它在类路径上的正确包之前。因此,即使我对 JSTL 1.2 有适当的依赖关系,它也会将 1.0 版本加载到 gwt-dev 内部。叽。

我的解决方案是不使用测试范围运行,因此我不会在运行时选择 gwt-test-utils 包。以其他方式从类路径中删除 gwt-dev 包也可以解决问题。


z
zony

如果使用 Tomcat 10:

下载

jakarta.servlet.jsp.jstl-2.0.0.jar

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

放置在 /WEB-INF/lib 文件夹中。

不要忘记重新启动Tomcat!


C
Claudiu Guiman

这对我有用

    <groupId>jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>

J
JavaSheriff

我有同样的问题,我正在使用eclipse,以防其他人遇到同样的问题:在eclipse中双击tomcat服务器,停止服务器取消勾选“服务器模块不发布”启动服务器。

https://i.stack.imgur.com/SOLa1.png


L
Lenny

解决了 Netbeans 12.3 和 Tomcat 9.0 中的相同问题:

1.在pom.xml中写入:

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId><version>1.2</version>
</dependency>

2.在项目中添加jstl-1.2.jar。

3.手动安装神器(选择jstl-1.2.jar-从网上下载)


h
hrbrmstr

通过选择解决了 IBM RAD 7.5 中的类似问题:

项目属性 Project Facets JSTL 复选框


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅