Как установить JSTL? Абсолютный uri: http://java.sun.com/jstl/core не может быть разрешен
Я не знаю, что я сделал неправильно, но я не могу включить 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>
22 ответа
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+, включенный через 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
папка проекта веб-приложения (не помещайте туда стандартные.jar или любые свободные файлы.tld!).
В случае, если вы на самом деле используете обычный сервер Java EE, такой как WildFly, Payara и т. Д., Вместо обычного сервлет-контейнера, такого как Tomcat, Jetty и т. Д., Вам вообще не нужно явно устанавливать JSTL. Обычные серверы Java EE уже предоставляют JSTL из коробки. Другими словами, вам не нужно добавлять JSTL в pom.xml
ни удалять любые файлы 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 или старше. В противном случае выражения 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>
Смотрите также:
- Документация по taglib для ядра JSTL (для правильных URI тегов)
- Информационная страница тега JSTL (для ссылок на скачивание JSTL и
web.xml
Примеры)
@BalusC совершенно прав, но если вы все еще сталкиваетесь с этим исключением, это означает, что вы что-то сделали не так. Наиболее важная информация, которую вы найдете, находится на странице информации о тегах SO JSTL.
По сути, это краткое изложение того, что вам нужно сделать, чтобы справиться с этим исключением.
Проверьте версию сервлета в web.xml:
<web-app version="2.5">
Проверьте, поддерживается ли версия JSTL для этой версии сервлета: версия 2.5 сервлета использует JSTL 1.2 или версия 2.4 сервлета использует JSTL 1.1
Ваш контейнер сервлетов должен иметь соответствующую библиотеку, или вы должны включить ее вручную в свое приложение. Например: JSTL 1.2 требует jstl-1.2.jar
Что делать с Tomcat 5 или 6:
Вам необходимо включить соответствующие файлы jar в каталог WEB-INF/lib (он будет работать только для вашего приложения) или в tomcat/lib (будет работать для всех приложений глобально).
Последняя вещь - это taglib в ваших файлах jsp. Для JSTL 1.2 правильным является следующее:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Я нашел другую причину для этого типа ошибки: в моем случае кто-то установил настройку catalina.properties tomcat.util.scan.StandardJarScanFilter.jarsToSkip
собственность на *
чтобы избежать регистрации предупреждений, пропуская тем самым необходимое сканирование Tomcat. Изменение этого значения по умолчанию на Tomcat и добавление соответствующего списка jar для пропуска (не включая jstl-1.2 или spring-webmvc) решило проблему.
- Загрузить jstl-1.2.jar
Добавьте эту директиву на свою страницу:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
Вставьте файл JAR в папку WEB-INF/lib. Это должно работать. (Это сработало для меня.)
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" %>
также, пожалуйста, проверьте наличие добавленных вами банок зависимостей. javax.servlet.jar
а также javax.servlet.jsp.jstl-1.2.1.jar
или нет в вашей папке WEB-INF/lib. В моем случае эти двое решили проблему.
Добавить jstl-1.2.jar
в tomcat/lib
папка.
С этим ваша ошибка зависимости будет исправлена снова.
Ответ на 2020 год
Вопрос по-прежнему очень популярен, но все ответы серьезно устарели. Все компоненты Java EE были разделены на различные проекты Джакарты, и JSTL не исключение. Итак, вот правильные зависимости Maven на сегодняшний день:
<dependency>
<groupId>jakarta.servlet.jsp.jstl</groupId>
<artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
<version>1.2.7</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
<version>1.2.6</version>
</dependency>
Да, версии и groupId не совпадают, но это особенность текущего состояния проекта.
Я просто хотел добавить исправление, которое я нашел для этой проблемы. Я не уверен, почему это сработало. У меня была правильная версия 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" %>
Что исправило эту проблему для меня, так это удаление тега scope из моего xml-файла в pom для моей зависимости jstl 1.2. Опять же, не уверен, почему это исправило это, но на тот случай, если кто-то делает пружину с учебником JPA и Hibernate по Pluralsight и настроил pom таким образом, попробуйте удалить тег scope и посмотреть, исправит ли это. Как я уже сказал, это сработало для меня.
Наиболее возможные решения на 2022 год
1 - Отсутствующие библиотеки: загрузите библиотеку jstl/1.2 и Java Servlet API » 4.0.1
2 - Добавьте эти библиотеки в свой проект, а также в
tomcat/lib
папка.
3 - Добавить:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
первая строка страницы.
4 - если вы используете maven, добавьте следующее в
pom.xml
файл :
<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>
Я упоминал, что зависимость Maven в pom.xml неверна. Так должно быть
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
Я полностью отключил инструменты MAVEN и Spring. И я должен был добавить следующую банку, чтобы заставить мою среду работать правильно.
- весна-АОП-4.0.3.RELEASE.jar
- spring-beans-4.0.3.RELEASE.jar (сложно найти это исправление, другие org.springframework<3.versions> просто не работали.
- пружинные контекстно-4.0.3.RELEASE.jar
- весна-ядро-4.0.3.RELEASE.jar
- весна-выражение-4.0.3.RELEASE.jar
- весна-веб-4.0.3.RELEASE.jar
- весна-webmvc-4.0.3.RELEASE.jar
- JSTL-1.2.jar
Хуже всего было jstl-api-1.2.jar
а также javax-servlet.jsp.jst-api-1.2.1.jar
, Они просто не работали.
`jstl-1.2.jar работал хорошо.
Если вы используете Spring boot, рассмотрите возможность удаления server.tomcat.additional-tld-skip-patterns=*.jar
из Application.properties
если есть
Просто в Eclipse была исправлена похожая проблема:
rightclick on project->Properties->Deployment Assembly->add Maven Dependencies
что-то пнуло раньше, пока я редактировал мой pom.xml
У меня были все необходимые файлы jar, taglib uri и web.xml были в порядке
Все ответы в этом вопросе помогли мне, но я решил добавить дополнительную информацию для потомков.
Оказалось, что у меня была тестовая зависимость от gwt-test-utils
который принес в gwt-dev
пакет. к несчастью gwt-dev
содержит полную копию Jetty, JSP, JSTL и т. д., которая опередила соответствующие пакеты в classpath. Так что, хотя у меня были правильные зависимости от JSTL 1.2, загрузка внутренней версии 1.0 gwt-dev
, Ворчать.
Решение для меня состояло в том, чтобы не работать с областью тестирования, поэтому я не беру gwt-test-utils
пакет во время выполнения. Удаление gwt-dev
Пакет из classpath каким-либо другим способом также исправил бы проблему.
Если вы все перепробовали, но это не помогло, перезапустите сервер. В моем случае я просто забыл перезапустить Tomcat, после добавления javax.servlet.jsp.jstl-1.2.1.jar
в lib
каталог.
У меня была такая же проблема, я использую eclipse, на случай, если другие столкнутся с той же проблемой:
в eclipse дважды щелкните сервер tomcat,
остановите сервер,
снимите флажок "серверные модули без публикации",
запустите сервер.
htt ps://stackru.com/image s/da949938093300a784ffddc38c9dba2fcbb62bed.png
Решена такая же проблема в Netbeans 12.3 и Tomcat 9.0:
1. Запишите в pom.xml:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId><version>1.2</version>
</dependency>
2. Добавьте jstl-1.2.jar в проект.
3.Установите вручную артефакт (выберите jstl-1.2.jar - скачанный из интернета)
При использовании Tomcat 10:
Скачать
jakarta.servlet.jsp.jstl-2.0.0.jar
jakarta.servlet.jsp.jstl-api-2.0.0.jar
Поместите в папку /WEB-INF/lib.
Не забудьте перезапустить Tomcat!
Версия 2023 У меня больше ничего не работало, кроме добавления следующего в pom.xml:PS: я понимаю, что версия 2.0.0 jakarta.servlet.jsp.jstl содержит некоторую уязвимость, пожалуйста, будьте осторожны.
<!-- https://mvnrepository.com/artifact/jakarta.servlet.jsp.jstl/jakarta.servlet.jsp.jstl-api -->
<dependency>
<groupId>jakarta.servlet.jsp.jstl</groupId>
<artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
<version>2.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.web/jakarta.servlet.jsp.jstl -->
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
<version>2.0.0</version>
</dependency>
Если у вас есть зависимости в виде символов подJava Resources/Libraries/Maven Dependencies
папка затем;Right-click Project >> properties >> Dependency Assembly >> Add >> Double click on (Maven Dependencies)
Это сработало для меня
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
Решил похожую проблему в IBM RAD 7.5, выбрав:
- Свойства проектов
- Проект Грани
- Флажок JSTL