我不知道我做错了什么,但我不能包括 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
web.xml
index.jsp <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
html>
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
@BalusC 是完全正确的,但是如果你仍然遇到这个异常,那说明你做错了什么。您可以在 SO JSTL Tag Info 页面上找到最重要的信息。
基本上,这是处理此异常所需要做的事情的摘要。
检查 web.xml 中的 servlet 版本:
如何处理 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" %>
我发现了此类错误的另一个原因:在我的例子中,有人将 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
设置,则在其下方有一个 jarsToScan
设置会覆盖 jarsToSkip
中的任何内容。我们最终将 taglibs*.jar
添加到 jarsToScan
,因为我们的标记库是 taglibs-standard-impl-1.2.5.jar
和 taglibs-standard-spec-1.2.5.jar
。
conf/catalina.properties
中,我将 tomcat.util.scan.StandardJarScanFilter.jarsToSkip=*.jar
更改为 tomcat.util.scan.StandardJarScanFilter.jarsToScan=jstl*.jar
并修复了它。
下载 jstl-1.2.jar 将此指令添加到您的页面: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 将 JAR 文件粘贴到您的 WEB -INF/lib 文件夹。这应该有效。 (它对我有用。)
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.jar
和 javax.servlet.jsp.jstl-1.2.1.jar
的依赖项 jar。就我而言,这两个解决了这个问题。
将 jstl-1.2.jar
添加到 tomcat/lib
文件夹中。
这样,您的依赖错误将再次得到修复。
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。
我只是想添加我为这个问题找到的修复程序。我不确定为什么会这样。我有正确版本的 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,请尝试删除范围标签并查看是否修复它。就像我说的那样,它对我有用。
我已经提到 pom.xml 中的 Maven 依赖项是错误的。它应该是
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
2022 年最可能的解决方案
- 缺少库:下载库 jstl/1.2 和 Java 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>
我完全禁用了 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.jar
和 javax-servlet.jsp.jst-api-1.2.1.jar
。他们只是没有工作。
jstl-1.2.jar
运行良好。
jstl-1.2
而不是 jstl-1.2.1
也对我有用,我不知道为什么。
如果您使用 Spring boot,请考虑从 Application.properties
中删除 server.tomcat.additional-tld-skip-patterns=*.jar
(如果有)
刚刚在 Eclipse 中遇到了类似的问题,修复了:
rightclick on project->Properties->Deployment Assembly->add Maven Dependencies
在我编辑我的 pom.xml 时,之前有什么东西把它踢了出来
我有所有需要的 jar 文件,taglib uri 和 web.xml 没问题
这个问题中的所有答案都对我有帮助,但我想我会为后代添加一些额外的信息。
原来我对 gwt-test-utils
有一个测试依赖项,它引入了 gwt-dev
包。不幸的是,gwt-dev
包含 Jetty、JSP、JSTL 等的完整副本,它在类路径上的正确包之前。因此,即使我对 JSTL 1.2 有适当的依赖关系,它也会将 1.0 版本加载到 gwt-dev
内部。叽。
我的解决方案是不使用测试范围运行,因此我不会在运行时选择 gwt-test-utils
包。以其他方式从类路径中删除 gwt-dev
包也可以解决问题。
如果使用 Tomcat 10:
下载
jakarta.servlet.jsp.jstl-2.0.0.jar
jakarta.servlet.jsp.jstl-api-2.0.0.jar
放置在 /WEB-INF/lib 文件夹中。
不要忘记重新启动Tomcat!
这对我有用
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
我有同样的问题,我正在使用eclipse,以防其他人遇到同样的问题:在eclipse中双击tomcat服务器,停止服务器取消勾选“服务器模块不发布”启动服务器。
https://i.stack.imgur.com/SOLa1.png
解决了 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-从网上下载)
通过选择解决了 IBM RAD 7.5 中的类似问题:
项目属性 Project Facets JSTL 复选框
不定期副业成功案例分享
compile('javax.servlet:jstl:1.2')
Intelij IDEA
中的@BalusC 在完成您提到的代码后,代码工作正常,但行http://java.sun.com/jsp/jstl/core
和<c:forEach>
以红色表示,编辑器显示无法解决它们的错误。如何解决?在IDEA