org.apache.jasper.JasperException:绝对uri:http
:
//java.sun.com/jstl/core不能在web.xml或与此应用程序一起部署的jar文件中解析
该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还通过指定了Apache的JSTL 1.1实现
taglibs:standard。当您已经通过捆绑了JSTL 1.2 API +
impl时,这是不必要的,甚至是危险的
javax.servlet:jstl,因为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-INF/lib到Web应用程序项目的文件夹中来实现相同目的(不要 在其中 拖放standard.jar或任何松散的.tld文件!)。
如果您实际上使用的是普通的Java
EE服务器(如WildFly,Payara等)而不是诸如Tomcat,Jetty等的准系统servlet容器,那么您根本不需要显式安装JSTL。普通的Java
EE服务器已经提供了JSTL。换句话说,您无需向
pom.xmlWebapp中添加JSTL 或删除任何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>



