我不知道我做错了什么,但我不能包括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>
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的一部分以便共享/重用EL逻辑在普通的JSP中)。
因此,请相应地修复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目标webapp中安装JSTL(不要将<scope>
设置为provided
,因为Tomcat实际上没有提供它!):
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
非Maven用户可以通过将单个jstl-1.2.jar文件放在Web应用程序项目的/WEB-INF/lib
文件夹中来实现相同目的(不要丢弃standard.jar或任何松散的.tld文件!)。
如果你实际上使用的是普通的Java EE服务器,比如WildFly,Payara等,而不是像Tomcat,Jetty等那样的准系统servlet容器,那么你根本不需要显式安装JSTL。普通的Java EE服务器已经提供了JSTL。换句话说,您不需要将JSTL添加到pom.xml
,也不需要删除webapp中的任何JAR / TLD文件。仅仅provided
作用域的Java EE坐标就足够了:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version><!-- 8.0, 7.0, etc depending on your server --></version>
<scope>provided</scope>
</dependency>
此外,您还应该确保您的web.xml
被声明符合至少Servlet 2.4,因此不是Servlet 2.3或更早版本。否则,JSTL标记内的EL表达式将无法工作。选择与您的目标容器匹配的最高版本,并确保您的<!DOCTYPE>
中没有web.xml
。这是一个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>
web.xml
示例)这个问题的所有答案对我有帮助,但我想我会为后代添加一些额外的信息。
事实证明,我对gwt-test-utils
有一个测试依赖,它引入了gwt-dev
包。不幸的是,gwt-dev
包含Jetty,JSP,JSTL等的完整副本,它比类路径上的正确包更早。因此即使我对JSTL 1.2有适当的依赖关系,它也会将qqlxswpoi内部的1.0版本加载。叽。
我的解决方案是不运行测试范围,所以我不会在运行时选择gwt-dev
包。以其他方式从类路径中删除gwt-test-utils
包也可以解决问题。
刚刚在Eclipse中遇到过类似的问题:
gwt-dev
在我编辑我的pom.xml时,之前有些东西被踢掉了
我有所有需要的jar文件,taglib uri和web.xml都可以
通过选择以下内容解决了IBM RAD 7.5中的类似问题:
@BalusC是完全正确的,但是如果你仍然遇到这个异常,那就意味着你做错了什么。您将在SO JSTL Tag Info页面上找到最重要的信息。
基本上,这是处理此异常需要执行的操作的摘要。
<web-app version="2.5">
如何处理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" %>
我发现了这种类型错误的另一个原因:在我的情况下,有人将conf/catalina.properties
设置tomcat.util.scan.StandardJarScanFilter.jarsToSkip
属性设置为*
以避免日志警告消息,从而跳过Tomcat进行必要的扫描。将其更改回Tomcat默认值并添加适当的jars列表(不包括jstl-1.2或spring-webmvc)解决了这个问题。
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.jar
和javax.servlet.jsp.jstl-1.2.1.jar
的依赖项。在我的情况下,这两个解决了这个问题。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
将jstl-1.2.jar
添加到tomcat/lib
文件夹中。
这样,您的依赖性错误将再次修复。
我已经提到pom.xml中的Maven依赖是错误的。它应该是
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
我只想添加我为此问题找到的修复程序。我不确定为什么会这样。我有正确版本的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标记。再次不确定为什么要修复它,但是为了防止有人正在使用JPA和Hibernate教程在pluralsight上进行弹簧并且以这种方式设置它们的pom,尝试删除范围标记并查看是否修复了它。就像我说它对我有用。
我完全禁用了MAVEN和Spring工具。我不得不添加以下jar来使我的环境正常工作。
最糟糕的是jstl-api-1.2.jar
和javax-servlet.jsp.jst-api-1.2.1.jar
。他们只是没有工作。
jstl-1.2.jar
运作良好。