首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何安装JSTL?无法解析绝对uri: http://java.sun.com/jstl/core

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

Stack Overflow用户
提问于 2011-02-08 08:19:37
回答 18查看 408.7K关注 0票数 149

我不知道我做错了什么,但我不能包括JSTL。我有jstl-1.2.jar,但不幸的是我得到了异常:

代码语言:javascript
复制
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

javax.servlet servlet-api 2.5提供javax.servlet.jsp jsp-api 2.1提供标记库标准1.1.2 javax.servlet jstl 1.2 jsp

  • index.jsp

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

EN

回答 18

Stack Overflow用户

回答已采纳

发布于 2011-02-08 08:26:13

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

该URI是针对JSTL1.0的,但实际上您使用的是JSTL1.2,它使用URI和一个额外的/jsp路径(因为发明EL表达式的JSTL1.1版就被集成为JSP1.1的一部分,以便在普通JSP中共享/重用EL逻辑)。

因此,根据JSTL documentation相应地修复标记库URI

代码语言:javascript
复制
<%@ 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的JSTL1.2 API+impl和来自Apache的JSTL1.1Impl。您应该只使用一个JSTL实现。

在Tomcat 10+上安装JSTL

如果您已经使用Tomcat10或更高版本(第一个Jakartified版本,使用jakarta.*包而不是javax.*包),请通过以下唯一依赖项使用JSTL2.0:

代码语言:javascript
复制
<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>jakarta.servlet.jsp.jstl</artifactId>
    <version>2.0.0</version>
</dependency>

非Maven用户可以通过将以下两个物理文件放入web应用程序项目的/WEB-INF/lib文件夹中来实现相同的目的(do 绝对不要将standard*.jar或任何松散的.tld文件放入其中!)如有必要,请将其删除)。

在Tomcat 9上安装JSTL -

如果您还没有使用Tomcat10,但仍然使用Tomcat9或更早的版本,那么可以通过这个唯一的依赖项使用JSTL1.2(它与Tomcat9/8/7/6/5兼容,但不是更旧的版本):

代码语言:javascript
复制
<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>jakarta.servlet.jsp.jstl</artifactId>
    <version>1.2.6</version>
</dependency>

非Maven用户可以通过将以下两个物理文件放入web应用程序项目的/WEB-INF/lib文件夹中来实现相同的目的(do 绝对不要将standard*.jar或任何松散的.tld文件放入其中!)如有必要,请将其删除)。

在普通JEE服务器上安装JSTL

如果你实际使用的是一个普通的Jakarta EE服务器,比如WildFly、Payara、TomEE、GlassFish、WebSphere、OpenLiberty、WebLogic等,而不是像Tomcat、Jetty、Undertow等这样的基本server容器,那么你根本不需要显式地安装JSTL。普通的Jakarta EE服务器已经提供了现成的JSTL。换句话说,您不需要将JSTL添加到pom.xml,也不需要在webapp中删除任何JAR/TLD文件。仅使用provided作用域的Jakarta EE坐标就足够了:

代码语言:javascript
复制
<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被声明为至少符合Servlet2.4,而不是Servlet2.3或更早的版本。否则,JSTL标记内的EL表达式将无法正常工作。选择与您的目标容器匹配的最高版本,并确保您的web.xml中没有<!DOCTYPE>。下面是一个与Servlet 5.0 (Tomcat 10)兼容的示例:

代码语言:javascript
复制
<?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)的示例:

代码语言:javascript
复制
<?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>

另请参阅:

票数 222
EN

Stack Overflow用户

发布于 2011-10-06 04:13:49

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

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

  1. 检查web.xml中的servlet版本:如果此servlet版本支持JSTL版本: Servlet版本2.5使用JSTL 1.2或Servlet版本2.4使用JSTL servlet容器必须具有适当的库,或者您必须手动将其包含在应用程序中。例如:JSTL1.2需要jstl-1.2.jar

如何使用Tomcat5或6:

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

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

代码语言:javascript
复制
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
票数 36
EN

Stack Overflow用户

发布于 2016-01-09 14:13:06

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

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4928271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档