如何安装 JSTL? 绝对路径: 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.(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
    
    
    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" %>
    
    
    
    
    
438613 次浏览

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 1.2文档相应地修改 taglib URI:

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

此外,还需要使 绝对确定不将多个不同版本的 JSTLJAR 文件一起抛入运行时类路径。这是 Tomcat 用户常犯的一个错误。Tomcat 的问题在于它不能立即提供 JSTL,因此必须手动安装它。在普通的 JakartaEE 服务器中不需要这样做。参见 JavaEE 到底是什么?

在您的特定示例中,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.1. x 上安装 JSTL

如果您已经使用 Tomcat 10.1.x (第二个 Jakartified 版本,使用 jakarta.*包而不是 javax.*包,但是第一个版本使用更新后的 jakarta.tags.* 名称空间 URN而不是 http://java.sun.com/jsp/jstl/*名称空间 URL) ,使用默认的 compile Maven 作用域,通过这个 比目鱼依赖项使用 JSTL 3.0(因为 Tomcat 不提供开箱即用的功能!):

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

注意,API 依赖项已经通过这个 impl 依赖项传递地包含在内,因此不需要显式地声明它。

非 Maven 用户可以通过删除 Web 应用程序项目的 /WEB-INF/lib文件夹中的以下两个物理文件来实现同样的功能(执行 绝对不行删除标准 *)。罐子或任何松动。TLD 文件在里面!如有需要,可把它们移除)。

如前所述,名称空间 URI 已更改为 URN 而不是 URL。JSTL 核心是因为 JSTL 3.0版本可以通过 URN 格式的更容易记忆的名称空间 URI 获得:

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

参见 JSTL 3.0文档

在 Tomcat 10.0. x 上安装 JSTL

如果您使用的是 Tomcat 10.0.x (第一个 Jakartified 版本,使用 jakarta.*包而不是 javax.*包) ,那么使用默认的 compile Maven 作用域(因为 Tomcat 不提供开箱即用的功能!) ,通过这个 比目鱼依赖项使用 JSTL 2.0:

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

注意,API 依赖项已经通过这个 impl 依赖项传递地包含在内,因此不需要显式地声明它。

非 Maven 用户可以通过删除 Web 应用程序项目的 /WEB-INF/lib文件夹中的以下两个物理文件来实现同样的功能(执行 绝对不行删除标准 *)。罐子或任何松动。TLD 文件在里面!如有需要,可把它们移除)。

在 Tomcat 9-上安装 JSTL

如果您还没有使用 Tomcat 10,但仍然使用 Tomcat 9或更老版本,那么可以使用 compile的默认 Maven 作用域(因为 Tomcat 不提供开箱即用的功能) ,通过这个 比目鱼依赖项使用 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>

注意,API 依赖项已经通过这个 impl 依赖项传递地包含在内,因此不需要显式地声明它。

非 Maven 用户可以通过删除 Web 应用程序项目的 /WEB-INF/lib文件夹中的以下两个物理文件来实现同样的功能(执行 绝对不行删除标准 *)。罐子或任何松动。TLD 文件在里面!如有需要,可把它们移除)。

在普通 JEE 服务器上安装 JSTL

如果你实际上使用的是一个普通的雅加达 EE 服务器,比如 WildFly、 Payara、 TomEE、 GlassFish、 WebSphere、 OpenLiberty、 WebLogic 等等,而不是一个简单的 servlet 容器,比如 Tomcat、 Jetty、 Undertwow 等等,那么你需要显式地安装 JSTL。普通的 JakartaEE 服务器 已经提供开箱即用的 JSTL。换句话说,您不需要将 JSTL 添加到 pom.xml,也不需要在 webapp 中删除任何 JAR/TLD 文件。仅仅使用 provided作用域的 JakartaEE 坐标就足够了:

<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-api</artifactId>
<version><!-- 10.0.0, 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 6.0(Tomcat 10.1.x)的示例:

<?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_6_0.xsd"
version="6.0">


<!-- Config here. -->


</web-app>

下面是一个兼容 Servlet 5.0(Tomcat 10.0.x)的示例:

<?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>

参见:

@ BalusC 是完全正确的,但是如果您仍然遇到这个异常,这意味着您做错了什么。您将发现最重要的信息是在 SOJSTL 标签信息页面。

基本上,这是对处理这个异常所需要做的工作的总结。

  1. 检查 web.xml: <web-app version="2.5">中的 servlet 版本

  2. 检查此 Servlet 版本是否支持 JSTL 版本: Servlet 版本 2.5使用 JSTL 1.2或 Servlet 版本 2.4使用 JSTL 1.1

  3. Servlet 容器必须具有适当的库,或者必须手动将其包含在应用程序中。例如: JSTL 1.2需要 Jstl-1.2. jar

如何处理 雄猫5或6:

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

最后是 jsp 文件中的 taglib:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
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。对我来说,这两个人解决了问题。

这个问题的所有答案都对我有所帮助,但我认为我应该为子孙后代增加一些额外的信息。

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

对我来说,解决方案是不使用测试范围运行,这样我就不会在运行时获取 gwt-test-utils包。以其他方式从类路径中移除 gwt-dev包也可以解决这个问题。

在 IBM RAD 7.5中通过选择以下命令解决了类似的问题:

  1. 项目属性
  2. 专题研究
  3. JSTL 复选框
  1. 下载 Jstl-1.2. jar
  2. 将此指令添加到页面: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

  3. 将 JAR 文件粘贴到 WEB-INF/lib 文件夹中 为我工作。)

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

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

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

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

我发现了这种类型错误的另一个原因: 在我的例子中,有人将 conf/catalina.properties设置为 tomcat.util.scan.StandardJarScanFilter.jarsToSkip属性以避免日志警告消息,从而跳过了 Tomcat 的必要扫描。将其修改为 Tomcat default 并添加一个要跳过的恰当的 jar 列表(不包括 jstl-1.2或 spring-webmvc)解决了这个问题。

我只是想添加我为这个问题找到的修复程序。我不知道为什么会有用。我有正确的 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" %>

对于我来说,解决这个问题的方法是为了我的 jstl 1.2依赖项从我的 xml 文件中删除 scope 标记。同样不确定为什么修复了它,但是以防有人在使用 JPA 和 Hibernate 教程在 multialsight 上做春天,并且以这种方式设置了他们的 pom,尝试删除 scope 标记,看看是否修复了它。就像我说的那样。

只是在 Eclipse 中遇到了类似的问题 固定的:

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

之前有东西把它踢出去了, 当我在编辑 pom.xml 的时候

我有所有需要的 jar 文件,taglib uri 和 web.xml 都可以

我已经完全禁用了 MAVEN 和 Spring 工具。为了让我的环境正常工作,我不得不添加以下罐子。

  • Spring-aop-4.0.3. RELEASE.jar
  • Spring-beans-4.0.3.RELEASE.jar (很难找到这个修复程序,其他 org.springFramework < 3. version > 就是不能工作。
  • 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运行良好。

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

这招对我很管用

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

2021年的答案

这个问题仍然很流行,但是所有的答案都严重过时了。所有 JavaEE 组件都被划分为不同的 Jakartaproject,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>

是的,版本和群组不匹配,但那是 项目当前状态的怪异之处

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

enter image description here

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

1. 在 pom.xml 中编写:

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

2. 在 project 中添加 jstl-1.2. jar。

3. 手动安装工件(选择从 Internet 下载的 jstl-1.2.jar)

2022年最可能的解决方案

1-丢失的库: 下载库 Jstl/1.2JavaServletAPI”4.0.1

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

3-Add: <%@ 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>

如果使用 Tomcat 10:

下载

Jstl-2.0.0. jar

Jsp.jstl-api-2.0.0. jar

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

别忘了重启雄猫!