Как установить 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>
    

Ответ 1

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 проекта веб-приложения (не удаляйте туда стандартные .jar или любые другие файлы .tld!).

В случае, если вы на самом деле используете обычный сервер Java EE, такой как WildFly, Payara и т.д., Вместо обычного сервлет-контейнера, такого как Tomcat, Jetty и т.д., Вам вообще не нужно явно устанавливать JSTL. Обычные серверы Java EE уже предоставляют JSTL из коробки. Другими словами, вам не нужно ни добавлять JSTL в pom.xml ни 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>

Смотрите также:

Ответ 2

@BalusC полностью прав, но если вы все еще сталкиваетесь с этим исключением, это означает, что вы сделали неправильно. Самая важная информация, которую вы найдете, находится на странице SO JSTL Tag Info.

В основном это сводка того, что вам нужно сделать, чтобы справиться с этим исключением.

  • Проверьте версию сервлета в 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" %>

Ответ 3

Я нашел другую причину для такого типа ошибки: в моем случае кто-то установил для свойства conf/catalina.properties свойство tomcat.util.scan.StandardJarScanFilter.jarsToSkip * чтобы избежать предупреждений журнала, тем самым пропуская необходимое сканирование Tomcat. Изменение этого значения по умолчанию на Tomcat и добавление соответствующего списка jar для пропуска (не включая jstl-1.2 или spring-webmvc) решило проблему.

Ответ 4

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. В моем случае эти два решили проблему.

Ответ 5

  1. Загрузить jstl-1.2.jar
  2. Добавьте эту директиву на свою страницу: <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

  3. Вставьте файл JAR в папку WEB-INF/lib. Это должно работать. (Это сработало для меня.)

Ответ 6

Добавьте jstl-1.2.jar в папку tomcat/lib.

С этим ваша ошибка зависимости будет исправлена снова.

Ответ 7

Я упомянул, что зависимость Maven в pom.xml неверна. Это должно быть

    <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>

Ответ 8

Я просто хотел добавить исправление, которое я нашел для этой проблемы. Я не уверен, почему это сработало. У меня была правильная версия 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" %>

Что исправлено для меня, это удаление тега области из моего xml файла в pom для моей зависимости jstl 1.2. Опять же не уверен, почему это исправлено, но на всякий случай кто-то делает spring с учебным пособием JPA и Hibernate по множественности и устанавливает свою настройку pom таким образом, попробуйте удалить тег области и посмотреть, исправляет ли он это. Как я сказал, это сработало для меня.

Ответ 9

Я полностью отключил инструменты MAVEN и Spring. И мне пришлось добавить следующую банку, чтобы заставить мою среду работать правильно.

  • spring-АОП-4.0.3.RELEASE.jar
  • spring-beans-4.0.3.RELEASE.jar (сложно найти это исправление, другие org.springframework <3.versions> просто не работали.
  • пружинные контекстно-4.0.3.RELEASE.jar
  • spring-ядро-4.0.3.RELEASE.jar
  • spring-выражение-4.0.3.RELEASE.jar
  • spring-веб-4.0.3.RELEASE.jar
  • spring-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 работал хорошо.

Ответ 10

Все ответы в этом вопросе помогли мне, но я подумал, что добавлю дополнительную информацию для потомков.

Оказалось, что у меня была тестовая зависимость от gwt-test-utils, которая привела к пакету gwt-dev. К сожалению, gwt-dev содержит полную копию Jetty, JSP, JSTL и т.д., Которая была впереди соответствующих пакетов в пути к классам. Поэтому, несмотря на то, что у меня были соответствующие зависимости от JSTL 1.2, он загружал версию версии 1.0 на gwt-dev. Grumble.

Решение для меня состояло в том, чтобы не запускаться с областью тестирования, поэтому я не собираю пакет gwt-test-utils во время выполнения. Удаление пакета gwt-dev из пути к классам каким-либо другим способом также устранило бы проблему.

Ответ 11

Если вы все пробовали, но это не помогло, вы должны перезапустить сервер. В моем случае я просто забыл перезапустить Tomcat после добавления каталога javax.servlet.jsp.jstl-1.2.1.jar в lib.

Ответ 12

Просто похожая проблема в Eclipse с:

rightclick on project->Properties->Deployment Assembly->add Maven Dependencies

что-то выгнало его раньше, в то время как я редактировал мой pom.xml

У меня были все необходимые файлы jar, taglib uri и web.xml были в порядке

Ответ 13

Если вы используете загрузку Spring, попробуйте удалить server.tomcat.additional-tld-skip-patterns=*.jar из Application.properties, если есть

Ответ 14

Устранена аналогичная проблема в IBM RAD 7.5, выбрав:

  • Свойства проектов
  • Границы проекта
  • Флажок JSTL