Подтвердить что ты не робот

Tomcat 7 и JSTL

Я написал веб-приложение с 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?

Что мне делать, чтобы решить проблему и запустить это приложение?

4b9b3361

Ответ 1

Tomcat никогда не включал JSTL.

Вы должны поместить jstl и стандартные банки в WEB-INF/lib (вы сделали это) и убедитесь, что у вас есть разрешения на их чтение (chmod)

Ваш URI правильный, и он должен работать (работает здесь)

Ответ 2

Я боролся с этим несколько часов. Вот полное решение.

  • Я использую 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. Это единственный пример того, что в более поздних итерациях что-то становится намного сложнее, чем проще.

Ответ 3

Ваш 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 вы можете скачать их здесь.

Это должно дать вам две банки:

  • JSTL-api.jar
  • JSTL-impl.jar

Используйте эти, вместо standard.jar и jstl.jar, которые были для предыдущей версии.

Сообщите нам, как это работает для вас.

Ответ 4

Для работы с 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>

Ответ 5

Для 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, что достаточно хорошо.

Ответ 6

Здесь есть два ответа, которые в основном правильны в отношении того, как решить эту проблему при использовании 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 описаны здесь:

Ответ 7

Ни один из них не работал у меня, я просто создал проект, не используя Maven и добавляя файлы JAR напрямую.

Ответ 8

Я страдал от ошибки: 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 снова.

Ответ 9

Кажется, что следующие проблемы в 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