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

时间:2009-12-13 13:03:50

标签: jsp tomcat jstl

这是我的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.jar standard.jar
谁能告诉我我犯了什么错误?

5 个答案:

答案 0 :(得分:15)

看起来你正在使用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版本取决于所使用的webcontainer / application服务器(更多, 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. 使用正确的TLD URI在JSP文件中声明taglib。您可以找到适用于JSTL 1.1和JSTL 1.2的here TLD文档。单击感兴趣的taglib以获取声明示例。

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

    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>
    

    确保您没有<!DOCTYPE ...>,否则它将以Servlet 2.3兼容性模式运行,然后EL表达式将停止工作。

    另见:

答案 1 :(得分:2)

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

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

  1. 检查web.xml文件中是否有匹配taglib标记的标记,然后按照taglib-location标记实际加载顶级域名。
  2. 如果未找到与#1匹配的内容,则递归检查应用程序中包含指定URI的TLD的所有JAR的META-INF目录。
  3. 在您的情况下,绝对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.tld的文件standard.jar并找到uri元素。如果您可以阅读<uri>http://java.sun.com/jstl/core</uri>,那么您就找到了问题。

    因此,要解决此问题,请在JSP中更改taglib声明,如下所示:

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

    或者(这是IMHO的首选解决方案),升级您的JSTL版本以匹配JSP所期望的版本,即使用JSTL 1.1。您可以从here下载此版本。然后,只需将jstl.jarstandard.jar放入WEB-INF/lib(如果您在META-INF/c.tld中查看standard.jar,就会看到它声明{{1} }})。

答案 2 :(得分:1)

由于可能看起来好主意的原因,JSTL的“发明者”改变了版本2.2和2.3之间的URL(我认为)。我曾多次诅咒这件事。

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

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

答案 3 :(得分:0)

在类似情况下帮助我的唯一解决方案是在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

所述

答案 4 :(得分:-3)

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

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