【问题标题】:How to install JSTL? The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved [duplicate]如何安装 JSTL?绝对uri:http://java.sun.com/jsp/jstl/core 无法解析[重复]
【发布时间】:2010-12-26 04:04:58
【问题描述】:

这是我的 JSP 页面的 taglib 指令:

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


我收到以下错误:

HTTP Status 500 - 
--------------------------------------------------------------------------------
type Exception report
message 
description The server encountered an internal error () that prevented it from fulfilling this request.
exception 
org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application
org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:51)
org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:409)
org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:116)
org.apache.jasper.compiler.TagLibraryInfoImpl.generateTLDLocation(TagLibraryInfoImpl.java:315)
org.apache.jasper.compiler.TagLibraryInfoImpl.<init>(TagLibraryInfoImpl.java:148)
org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:420)
org.apache.jasper.compiler.Parser.parseDirective(Parser.java:476)
org.apache.jasper.compiler.Parser.parseElements(Parser.java:1426)
org.apache.jasper.compiler.Parser.parse(Parser.java:133)
org.apache.jasper.compiler.ParserController.doParse(ParserController.java:215)
org.apache.jasper.compiler.ParserController.parse(ParserController.java:102)
org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:167)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:306)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:286)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:273)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:566)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:308)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)


我在 /WEB-INF/lib 文件夹中添加了 JAR 文件 jstl.jarstandard.jar
谁能告诉我哪里出错了?

【问题讨论】:

  • 你在什么服务器上运行?较新的容器已经包含 JSTL,打包自己的副本可能会造成混淆。

标签: jsp tomcat jstl


【解决方案1】:

看起来您使用的是 JSTL 1.0,taglib URI 为 1.1/1.2。您有不同版本的 JSTL:

  • 1.0:存在两个JAR 文件jstl.jarstandard.jar。 Taglib URI 在路径中没有/jsp,库名称以_rt 为后缀,如http://java.sun.com/jstl/core_rt。出现并至少需要 Servlet 2.3 / JSP 1.2。寿命结束,现在不要使用它。
  • 1.1:存在与 1.0 相同的 JAR 文件。 Taglib URI 没有后缀,在路径中包含/jsp,如http://java.sun.com/jsp/jstl/core。出现并至少需要 Servlet 2.4 / JSP 2.0。
  • 1.2:存在一个 JAR 文件jstl-1.2.jar,并且与 1.1 具有相同的 tagtlib URI。与 Servlet 2.5 / JSP 2.0 一起出现,但也适用于 Servlet 2.4 / JSP 2.0。

您可以通过使用 zip 工具提取 JAR 文件并阅读 MANIFEST.MF 文件来找到确切的 JSTL 版本。

Servlet/JSP 版本取决于所使用的 web 容器/应用服务器(更重要的是,它 Servlet/JSP 实现)并且版本级别可在web.xml 中配置。如果您至少使用 Servlet 2.5 / JSP 2.0 实现,例如 Tomcat 6.0,那么我建议您只选择 JSTL 1.2。安装 JSTL 应该没那么难:

  1. jstl-1.2.jar 文件放在Webapp/WEB-INF/lib 中。或者当您使用 Maven 时:

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
    
  2. 在 JSP 文件中使用正确的 TLD URI 声明 taglib。您可以找到here 适用于 JSTL 1.1 和 JSTL 1.2 的 TLD 文档。单击感兴趣的标记库以获取声明示例。

确保类路径中没有旧 JSTL 版本的重复项(包括 JRE/libAppserver/lib)以避免冲突。如果您对应用服务器拥有完全的管理员级别控制权,那么您还可以将 JAR 文件放在 Appserver/lib 而不是 Webapp/WEB-INF/lib 中,以便将其应用于所有已部署的 webapp。至少不要像一些糟糕的在线教程所建议的那样,提取 JAR 文件并将其内容(松散的 TLD 文件)弄乱类路径和/或在 您的 webapp 的web.xml 中声明标记库。

web.xml 中的 servlet 版本声明也影响 JSTL 的功能。通常的做法是您将其声明为您的 webcontainer/appserver 支持的最高级别。对于 Servlet 3.0,web.xml 应如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<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_3_0.xsd"
    version="3.0">
    
    <!-- Config here. -->

</web-app>

确保其中没有&lt;!DOCTYPE ...&gt;,否则它将以 Servlet 2.3 兼容性方式运行,然后 EL 表达式将停止工作。

另见:

【讨论】:

  • 非常有用且内容丰富的答案!如果没有其他人,你至少有我的赞成票,因为我大大放大了我所拥有的信息。
【解决方案2】:

在类似情况下帮助我的唯一解决方案是在 pom 中声明以下依赖项

<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>javax.servlet</groupId>
   <artifactId>jstl</artifactId>
   <version>1.2</version>
</dependency>
<dependency>
   <groupId>org.apache.tomcat</groupId>
   <artifactId>el-api</artifactId>
   <version>6.0.26</version>
   <scope>provided</scope>
</dependency>
<dependency>
   <groupId>org.apache.tomcat</groupId>
   <artifactId>jasper-el</artifactId>
   <version>6.0.26</version>
   <scope>provided</scope>
</dependency>

here所述

【讨论】:

    【解决方案3】:

    当像你一样声明tabglib 时,URI 用于唯一标识 taglib 的内部注册表中的每个 taglib,就像一个键用于从 HashMapHashtable 中设置/获取值Java。

    根据 Sun 规范,将 URI 解析为可由应用程序加载/调用的实际标记库按以下顺序进行:

    1. 检查web.xml 文件以匹配具有给定URI 的taglib 标记,然后按照taglib-location 标记实际加载TLD。
    2. 如果未找到与 #1 的匹配项,请递归检查应用程序中所有 JAR 的 META-INF 目录中是否包含包含指定 URI 的 TLD。

    在您的情况下,绝对 uri:http://java.sun.com/jsp/jstl/core 无法在 web.xml 或随此应用程序部署的 jar 文件中解析,如 org.apache.jasper.JasperException 所示,因此必须存在不匹配某处(在 URI 和相应的 JSTL 版本之间)。

    在这里,我猜你已经从 JSTL 1.0 部署了 jstl.jarstandard.jar。要验证这一点,请打开文件 META-INF/c.tldstandard.jar 并找到 uri 元素。如果你能读到的是&lt;uri&gt;http://java.sun.com/jstl/core&lt;/uri&gt;,那么你就找到了问题。

    所以,要解决这个问题,可以像这样更改 JSP 中的 taglib 声明:

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

    或者(恕我直言,这是首选解决方案),升级您的 JSTL 版本以匹配 JSP 期望的版本,即使用 JSTL 1.1。您可以从here 下载此版本。然后,只需将jstl.jarstandard.jar 放入您的WEB-INF/lib(如果您在standard.jar 中检查META-INF/c.tld,您会看到它声明了&lt;uri&gt;http://java.sun.com/jsp/jstl/core&lt;/uri&gt;)。

    【讨论】:

      【解决方案4】:

      如果可能,使用 tld 的本地路径而不是 http://java.sun.com/jsp/jstl/core,如下所示:

      <%@ taglib uri="./tld/core.tld" prefix="c" %>
      

      【讨论】:

      • 这是URI,而不是URL,在这种情况下,相对路径没有意义,尽管某些容器可能允许这样做,但它是非标准且不可移植的。
      【解决方案5】:

      出于似乎是个好主意的原因,JSTL 的“发明者”在 2.2 和 2.3 版本之间更改了 URL(我认为)。我曾多次诅咒过这一点。

      对于第一个近似值,您可以尝试从引用的 URI 中删除“jsp”。

      这里有更多有趣但令人困惑的信息:http://forums.sun.com/thread.jspa?threadID=486791

      【讨论】:

        猜你喜欢
        • 2016-06-22
        • 2011-08-05
        • 2014-09-03
        • 2013-04-28
        • 2011-05-28
        • 1970-01-01
        • 2020-11-10
        相关资源
        最近更新 更多