Ответ 1
Tomcat никогда не включал JSTL.
Вы должны поместить jstl и стандартные банки в WEB-INF/lib
(вы сделали это) и убедитесь, что у вас есть разрешения на их чтение (chmod)
Ваш URI правильный, и он должен работать (работает здесь)
Я написал веб-приложение с Eclipse Tomcat, и он работает на моем локальном Tomcat 7, когда я попытался опубликовать его в Интернете на Tomcat 7, у меня была следующая ошибка:
SEVERE: Servlet.service() для сервлета [obliquid.servlet.Index] в контексте пути [/cp] выбрано исключение [Абсолютный uri:
http://java.sun.com/jsp/jstl/core
не может быть разрешен либо в файле web.xml, либо в файлах jar с этим приложением]
В Tomcat 7 есть "версии версии: Servlet 3.0, JSP 2.2, EL 2.2", поэтому JSTL не включен?
Когда я попытался загрузить standard.jar и jstl.jar, у меня была следующая ошибка:
org.apache.jasper.JasperException:/jsp/index.jsp(строка: 3, столбец: 62) Невозможно прочитать TLD "META-INF/c.tld" из JAR файла "jndi:/localhost/cp/WEB-INF/lib/standard.jar": org.apache.jasper.JasperException: не удалось загрузить или создать экземпляр класса TagLibraryValidator: org.apache.taglibs.standard.tlv.JstlCoreTLV
Я сделал некоторые поисковые запросы, но я не мог разобраться, некоторые говорили, что это может быть вызвано противоречивыми версиями фляг. Может быть, я не должен включать эти банки и использовать другой JSTL-url? Mine для JSTL 1.1 Я думаю, есть ли новый URL для JSTL 1.2?
Что мне делать, чтобы решить проблему и запустить это приложение?
Tomcat никогда не включал JSTL.
Вы должны поместить jstl и стандартные банки в WEB-INF/lib
(вы сделали это) и убедитесь, что у вас есть разрешения на их чтение (chmod)
Ваш URI правильный, и он должен работать (работает здесь)
Я боролся с этим несколько часов. Вот полное решение.
Я использую Tomcat 7, который является сервером, совместимым с Servlet 3.0.
Если вы хотите использовать спецификацию Servlet 3.0, вы должны иметь свой 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_3_0.xsd" version="3.0">
Если вы используете Maven, ваш pom.xml должен иметь эти строки.
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jstl-impl</artifactId>
<version>1.2</version>
<exclusions>
<exclusion>
<artifactId>servlet-api</artifactId>
<groupId>javax.servlet</groupId>
</exclusion>
<exclusion>
<artifactId>jsp-api</artifactId>
<groupId>javax.servlet.jsp</groupId>
</exclusion>
<exclusion>
<artifactId>jstl-api</artifactId>
<groupId>javax.servlet.jsp.jstl</groupId>
</exclusion>
</exclusions>
</dependency>
Эти зависимости очень важны. JSTL 2.1 + Tomcat 7 + Servlet 3.0 очень сломан, если вы не исправите его, используя эти строки, особенно часть исключения. Что происходит, JSTL 2.1 Jars на самом деле вытягивает неправильные версии спецификации Servlet - 2.5. Если вы не прекратите это, вы окажетесь в целом мире боли. Особая благодарность Господин. Мюррей Тодд Уильямс за эти идеи.
Наконец, в случае, если Maven не сможет найти эти JARS, вы можете сделать Eclipse счастливым, включив три JARS в свой проект и выполнив обычный Project → Properties → Java Build Path и включив их таким образом - Хотя Maven должен позаботиться об этом.
javax.servlet-api-3.0.1.jar
javax.servlet.jsp.jstl-1.2.1.jar
javax.servlet.jsp.jstl-api-1.2.1.jar
Обратите внимание! Эта точная конфигурация применяется только в том случае, если вы используете магическую комбинацию:
Сервлет-совместимый сервер приложений, такой как Tomcat 7
Ваш web.xml имеет правильное пространство имен для спецификации Servlet 3.0
У вас есть три JARS и другие JSTL или Servlet JARS в вашем пути к классам.
Убедитесь, что вы не размещаете копии этих JAR в каталоге WEB-INF/lib, потому что в этом случае они будут отправлены на сервер, что вызовет LinkageErrors.
В вашем JSP вам нужно иметь эту строку PRECISE, отформатированную точно так же, как у меня есть, иначе Eclipse будет скулить, что он не распознает теги c: blah:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
Какая отдаленная PITA! Это намного сложнее реализовать, чем любая другая версия JSTL. Это единственный пример того, что в более поздних итерациях что-то становится намного сложнее, чем проще.
Ваш uri правильный для JSTL 1.2. Вам нужно сделать две вещи:
Измените web.xml
, чтобы использовать последнюю версию веб-приложения.
Он должен выглядеть примерно так или более поздней версии;
<?xml version="1.0" encoding="UTF-8"?>
<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_3_0.xsd"
version="3.0">
Во-вторых, поставьте правильную версию jstl jars в свой код. Для 1.2 вы можете скачать их здесь.
Это должно дать вам две банки:
Используйте эти, вместо standard.jar
и jstl.jar
, которые были для предыдущей версии.
Сообщите нам, как это работает для вас.
Для работы с apache tomcat 7 добавление этих данных в ваш POM, вероятно, подходит. Эти банки не ссылаются на банки javax.servlet, такие как стеклянная рыба, поэтому нет необходимости в исключениях.
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-spec</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-impl</artifactId>
<version>1.2.1</version>
</dependency>
Для Tomcat для JSTL 1.1.2 существует более простое решение для зависимостей:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<!-- Apache Taglibs does not implement version 1.2 -->
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>c</artifactId>
<version>1.1.2</version>
<type>tld</type>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>fmt</artifactId>
<version>1.1.2</version>
<type>tld</type>
</dependency>
<dependency>
Подробнее см. здесь для личного пользования.
REM: Подробнее по запросу, нужно включить JSTL-зависимости, чтобы сделать их доступными для Tomcat. Тем не менее, версия 1.2 на самом деле не нужна, поскольку версия 1.1.2 (поставляемая Apache, например Tomcat) тоже выполняет эту работу. Его единственное требование - Servlet 2.4 и JSP 2.2, а OP упоминает Servlet 3.0 и JSP 2.0, что достаточно хорошо.
Здесь есть два ответа, которые в основном правильны в отношении того, как решить эту проблему при использовании Maven при решении этой проблемы. Однако оба они не заполнены на 100%.
Использование исключений для каждого @Ответ на вопрос Охотника
Этот ответ работает. Тем не менее, все еще будут сообщения журнала от Tomcat относительно дублирующих определений ДВУ. Это связано с тем, что и артефакты jstl и jstl-impl включают определения TLD. Чтобы удалить эти сообщения, я думаю, что лучше настроить Maven:
<dependency>
<version>1.2</version>
<scope>runtime</scope>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<exclusions>
<exclusion>
<artifactId>servlet-api</artifactId>
<groupId>javax.servlet</groupId>
</exclusion>
<exclusion>
<artifactId>jsp-api</artifactId>
<groupId>javax.servlet.jsp</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jstl-impl</artifactId>
<version>1.2</version>
<scope>runtime</scope>
<exclusions>
<exclusion>
<artifactId>servlet-api</artifactId>
<groupId>javax.servlet</groupId>
</exclusion>
<exclusion>
<artifactId>jsp-api</artifactId>
<groupId>javax.servlet.jsp</groupId>
</exclusion>
<exclusion>
<artifactId>jstl-api</artifactId>
<groupId>javax.servlet.jsp.jstl</groupId>
</exclusion>
</exclusions>
</dependency>
Это включает только классы jstl api с необходимыми исключениями, чтобы избежать проблем, объясненных в остальной части этого ответа.
Использование новых версий POM за @George answer
Мне потребовалось некоторое время, чтобы понять это, но есть новые версии JSTL pom. Это действительно сбивает с толку, потому что эти новые пакеты используют аналогичные, но несколько разные соглашения об именах. Эти новые версии отмечают зависимости javax.servlet, javax.jsp и т.д. Как предоставленную область, поэтому их не нужно исключать. Версия 1.2.1 зависит от версии 1.2.1 jstl-api. И так это будет работать так же, как и выше:
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.servlet.jsp.jstl</artifactId>
<version>1.2.1</version>
<scope>runtime</scope>
</dependency>
Это немного отличается от ответа Джорджа, потому что я изменил область действия на время выполнения. Джордж указал область применения. С предоставленной областью банки должны быть скопированы вручную в каталог Tomcat lib, или какая-либо другая зависимость должна была включать необходимую реализацию.
Тем не менее, я не смог найти версию 1.2.1 для импликации в maven central, jboss repo или любых других репозиториях. Я закончил кругом и, наконец, просто использовал репозиторий на основе локального файла, чтобы хранить банку. Зависимость и jar описаны здесь:
Ни один из них не работал у меня, я просто создал проект, не используя Maven и добавляя файлы JAR напрямую.
Я страдал от ошибки: SEVERE: Servlet.service() для сервлета [obliquid.servlet.Index] в контексте пути [/cp] выбрал исключение [Абсолютный uri: http://java.sun.com/jsp/jstl/core не может быть разрешено в файле web.xml или файлах jar, развернутых с этим приложением] на Tomcat 7
Решение: скопируйте jars jstl-1.2.jar и javax.servlet.jsp.jstl-api-1.2.1.jar прямо в библиотеку библиотеки Tomcat. Обновите Tomcat Library в Eclipse снова.
Кажется, что следующие проблемы в pom.xml устраняют проблему:
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.servlet.jsp.jstl</artifactId>
<version>1.2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>javax.servlet.jsp.jstl-api</artifactId>
<version>1.2.1</version>
<scope>provided</scope>
</dependency>
Это была странная комбинация - две разные группы, но она работает:). Я ожидал увидеть тот же идентификатор группы для обоих банок. Мне удалось переделать без проблем Tomcat 7.
Кроме того, если вы видите "Тег Unkown