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

标签 jsp servlets jstl

我不知道我做错了什么,但我不能包含 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
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.1</version>
      <scope>provided</scope>
    </dependency>
    
    <dependency>
      <groupId>taglibs</groupId>
      <artifactId>standard</artifactId>
      <version>1.1.2</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>
    
  • web.xml
    <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
      version="2.5">
    
  • index.jsp
    <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
    <html> 
    <head></head>
    <body></body>
    </html>
    
  • 最佳答案

    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


    该 URI 适用于 JSTL 1.0,但您实际上使用的是 JSTL 1.2,它使用带有附加 /jsp 的 URI。路径(因为发明 EL 表达式的 JSTL 从 1.1 版开始作为 JSP 的一部分集成,以便在普通 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 实现。
    在 Tomcat 10+ 上安装 JSTL
    如果您已经使用 Tomcat 10 或更新版本(第一个 Jakartified 版本,使用 jakarta.* 包而不是 javax.* 包),请通过此 使用 JSTL 2.0鞋底 依赖:
    <dependency>
        <groupId>org.glassfish.web</groupId>
        <artifactId>jakarta.servlet.jsp.jstl</artifactId>
        <version>2.0.0</version>
    </dependency>
    
    非 Maven 用户可以通过在 /WEB-INF/lib 中删除以下两个物理文件来实现相同的效果。 Web 应用程序项目的文件夹(做 绝对不要 删除标准 *.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 上安装 JSTL 9-
    如果您还没有使用 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-INF/lib 中删除以下两个物理文件来实现相同的效果。 Web 应用程序项目的文件夹(做 绝对不要 删除标准 *.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 等,而不是准系统 servletcontainer,例如 Tomcat、Jetty、Undertow 等,那么您就不需要完全显式安装 JSTL。普通的 Jakarta EE 服务器已经提供了开箱即用的 JSTL。换句话说,您不需要将 JSTL 添加到 pom.xml也不要在 webapp 中删除任何 JAR/TLD 文件。只有 provided范围内的 Jakarta EE 坐标就足够了:
    <dependency>
        <groupId>jakarta.platform</groupId>
        <artifactId>jakarta.jakartaee-api</artifactId>
        <version><!-- 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 表达式将无法工作。选择与您的目标容器匹配的最高版本,并确保您没有 <!DOCTYPE>在您的任何地方 web.xml .这是一个与 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 core taglib documentation (对于正确的 taglib URI)
  • EL expressions not evaluated in JSP
  • How to configure pom.xml for Tomcat 10+ or Tomcat 9-
  • 关于jsp - 如何安装JSTL?绝对uri : http://java. sun.com/jSTL/core 无法解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4928271/

    相关文章:

    java - Struts2 在带有 &quote 的 jsp 文件上显示 json 数据

    java - 我可以将 servlet 与 Angular JS 结合使用并实现 MVC 架构吗?

    java - 如何使用 AJAX 将数组从 Servlet 发送到 Javascript?

    java - 在 JSP 上获得双倍值

    jsp - 如何删除jSTL中的 session 变量

    java - 尝试在我的 jsp 模板中使用 JSTL 进行 OR 测试

    java - 资源文件夹下的 css 文件中图像 url 的值应该是多少,并且此资源文件夹在 spring 中映射为默认 servlet?

    javascript - 如何将多维数组从 Java 请求变量复制到 JSP 页面中的 Javascript 变量?

    security - 阻止直接访问 Struts2 中的 *.jsp 和 *.action

    javascript - 使用 AJAX 使用 JSON 填充选项卡