org.apache.jasper.JasperException: абсолютное значение uri: http://java.sun.com/jstl/core не может быть разрешено ни в файле web.xml, ни в файлах jar, развернутых с помощью этого приложения
ЭтоURI для JSTL 1.0, но вы на самом деле используете JSTL 1.2, который использует URI с дополнительным путем /jsp
(потому что JSTL, который изобрел выражения EL, был начиная с версии 1.1, интегрирован как часть JSP для совместного использования / повторного использования ELлогика и в простом JSP).
Итак, исправьте URI taglib соответствующим образом:
<%@ 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 должна сделать это для того, чтобы JSTL был установлен в вашем веб-приложении, ориентированном на Tomcat (не не установите <scope>
на provided
, как это не делает Tomcatне предоставляйте это прямо из коробки!):
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
Пользователи, не являющиеся владельцами Maven, могут добиться того же самого, сбросив единственный файл jstl-1.2.jar в папку /WEB-INF/lib
в папкепроект веб-приложения (не делайте , а не , добавьте standard.jar или любые другие файлы .tld туда!).
В случае, если вы на самом деле используете обычный сервер Java EE, такой как WildFly, Payaraи т. д. вместо базового контейнера сервлетов, такого как Tomcat, Jetty и т. д., вам вообще не нужно явно устанавливать JSTL.Обычные серверы Java EE уже предоставляют JSTL из коробки.Другими словами, вам не нужно ни добавлять JSTL в pom.xml
, ни удалять файлы JAR / TLD в веб-приложении.Только координаты 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>
Кроме того, вы также должны убедиться, что ваш web.xml
объявлен как соответствующий как минимум Servlet 2.4 и, следовательно, не как Servlet2.3 или старше.В противном случае выражения EL внутри тегов JSTL, в свою очередь, не будут работать.Выберите самую высокую версию, соответствующую вашему целевому контейнеру, и убедитесь, что у вас нет <!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>
См. Также: