我不知道我做错了什么,但我不能包括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
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”%>
发布于 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
<%@ 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:
<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兼容,但不是更旧的版本):
<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坐标就足够了:
<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)兼容的示例:
<?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>
另请参阅:
发布于 2011-10-06 04:13:49
@BalusC是完全正确的,但是如果你仍然遇到这个异常,这意味着你做错了什么。您将在SO JSTL Tag Info页面上找到最重要的信息。
基本上,这是处理此异常所需操作的摘要。
如何使用Tomcat5或6:
您需要在WEB-INF/lib目录(它只适用于您的应用程序)或tomcat/lib目录(适用于所有应用程序)中包含适当的jar。
最后一件事是jsp文件中的taglib。对于JSTL 1.2,正确的方法是:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
发布于 2016-01-09 14:13:06
我发现了导致这种类型错误的另一个原因:在我的例子中,有人将Tomcat tomcat.util.scan.StandardJarScanFilter.jarsToSkip
属性设置为*
,以避免记录警告消息,从而跳过必要的conf/catalina.properties
扫描。将其改回Tomcat默认设置并添加适当的要跳过的jars列表(不包括jstl-1.2或spring-webmvc)解决了这个问题。
https://stackoverflow.com/questions/4928271
复制相似问题