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

时间:2011-02-08 00:19:37

标签: 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>
    

17 个答案:

答案 0 :(得分:167)

  

org.apache.jasper.JasperException:无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:http://java.sun.com/jstl/core

该URI适用于JSTL 1.0,但您实际上使用的是JSTL 1.2,它使用带有额外/jsp路径的URI(因为发明EL表达式的JSTL自版本1.1开始作为JSP的一部分集成在一起在普通JSP中共享/重用EL逻辑。)

因此,请相应地修复taglib URI:

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

此外,您的POM还通过taglibs:standard指定Apache的JSTL 1.1实现。当你已经通过javax.servlet:jstl捆绑了JSTL 1.2 API + impl时,这是不必要的甚至是危险的,因为1.1和1.2显然会相互冲突。只有 以下JSTL 1.2依赖项才能在您的Tomcat目标Web应用程序中安装JSTL(<scope>设置为{{1因为Tomcat实际上没有提供它!):

provided

非Maven用户可以通过删除Web应用程序项目的<dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> 文件夹中的单个jstl-1.2.jar文件来实现相同目的( drop standard.jar或任何松散的那里有.tld文件!)。

如果你实际上使用的是普通的Java EE服务器,比如WildFly,Payara等,而不是像Tomcat,Jetty等那样的准系统servlet容器,那么你根本不需要显式安装JSTL。普通的Java EE服务器已经提供了JSTL。换句话说,您不需要将JSTL添加到/WEB-INF/lib,也不需要删除webapp中的任何JAR / TLD文件。仅仅pom.xml范围的Java EE坐标就足够了:

provided

此外,您还应该确保您的<dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version><!-- 8.0, 7.0, etc depending on your server --></version> <scope>provided</scope> </dependency> 被声明符合至少 Servlet 2.4,因此不是Servlet 2.3或更早版本。否则,JSTL标记内的EL表达式将无法工作。选择与目标容器匹配的最高版本,并确保web.xml中的任何位置都没有<!DOCTYPE>。这是一个Servlet 4.0(Tomcat 9)兼容的例子:

web.xml

另见:

  • JSTL core taglib documentation(对于正确的taglib URI)
  • JSTL tag info page(适用于JSTL下载链接和<?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> 示例)

答案 1 :(得分:36)

@BalusC是完全正确的,但如果你仍然遇到这个例外,那就意味着你做错了什么。您将在SO JSTL Tag Info页面上找到最重要的信息。

基本上,这是处理此异常需要执行的操作的摘要。

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

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

  3. 您的servlet容器必须具有相应的库,或者您必须在应用程序中手动包含它。例如:JSTL 1.2需要 jstl-1.2.jar

  4. 如何处理 Tomcat 5或6:

    您需要在WEB-INF / lib目录中包含适当的jar(它只适用于您的应用程序)或tomcat / lib(适用于所有应用程序的全局工作)。

    最后一件事是你的jsp文件中的taglib。对于JSTL 1.2,正确的是:

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

答案 2 :(得分:13)

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。就我而言,这两个问题解决了这个问题。

答案 3 :(得分:12)

我发现了此类错误的另一个原因:在我的情况下,有人将conf/catalina.properties设置tomcat.util.scan.StandardJarScanFilter.jarsToSkip属性设置为*以避免出现日志警告消息,从而跳过必要的扫描Tomcat的。将其更改回Tomcat默认值并添加适当的jars列表(不包括jstl-1.2或spring-webmvc)解决了这个问题。

答案 4 :(得分:9)

  1. 下载jstl-1.2.jar
  2. 将此指令添加到您的页面:<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

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

答案 5 :(得分:6)

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

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

答案 6 :(得分:3)

我已经提到pom.xml中的Maven依赖是错误的。它应该是

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

答案 7 :(得分:3)

我只是想添加我为此问题找到的修复程序。我不确定为什么会这样。我有正确版本的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依赖项的pom中删除了我的xml文件中的scope标记。再次不确定为什么修复它,但是为了防止有人在pentsight上使用JPA和Hibernate教程进行弹簧并且以这种方式设置它们的pom,尝试删除范围标记并查看是否修复了它。就像我说它对我有用。

答案 8 :(得分:2)

我完全禁用了MAVEN和Spring工具。我必须添加以下jar以使我的环境正常工作。

  • 弹簧AOP-4.0.3.RELEASE.jar
  • spring-beans-4.0.3.RELEASE.jar(很难找到这个修复,其他org.springframework&lt; 3.versions&gt;只是没有用。
  • 弹簧上下文4.0.3.RELEASE.jar
  • 弹簧芯4.0.3.RELEASE.jar
  • 弹簧表达-4.0.3.RELEASE.jar
  • 弹簧网络4.0.3.RELEASE.jar
  • 弹簧webmvc-4.0.3.RELEASE.jar
  • JS​​TL-1.2.jar

最糟糕的是jstl-api-1.2.jarjavax-servlet.jsp.jst-api-1.2.1.jar。他们只是没有工作。

jstl-1.2.jar效果很好。

答案 9 :(得分:0)

这个问题的所有答案对我有帮助,但我想我会为后代添加一些额外的信息。

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

我的解决方案是不运行测试范围,因此我不会在运行时选择gwt-test-utils包。以其他方式从类路径中删除gwt-dev包也可以解决问题。

答案 10 :(得分:0)

在Eclipse中遇到过类似的问题 修复:

rightclick on project->Properties->Deployment Assembly->add Maven Dependencies
以前踢过的东西, 我正在编辑我的pom.xml

我有所有需要的jar文件,taglib uri和web.xml都没问题

答案 11 :(得分:0)

如果您使用Spring Boot,请考虑从server.tomcat.additional-tld-skip-patterns=*.jar中删除Application.properties,如果有

答案 12 :(得分:0)

2020年的答案

这个问题仍然很受欢迎,但是所有答案都严重过时了。所有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

答案 13 :(得分:-1)

这对我有用

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

答案 14 :(得分:-1)

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

enter image description here

答案 15 :(得分:-1)

在 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——网上下载的)

答案 16 :(得分:-2)

通过选择:

解决了IBM RAD 7.5中的类似问题
  1. 项目属性
  2. Project Facets
  3. JSTL复选框