Tomcat 7 и JSTL - PullRequest
       32

Tomcat 7 и JSTL

44 голосов
/ 23 мая 2011

Я написал веб-приложение с 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 имеет «Spec версии: Servlet 3.0, JSP 2.2, EL 2.2», поэтому JSTL не включен?

Когда я пытался загрузить стандартные.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.JstlCoreTL **

Я немного погуглил, но не смог разобраться, некоторые сказали, что этоЭто может быть вызвано противоречивыми версиями банок.Может быть, я не должен включать эти банки и использовать другой URL-адрес JSTL?Мой для JSTL 1.1 Я думаю, есть ли новый URL для JSTL 1.2?

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

Ответы [ 9 ]

54 голосов
/ 20 мая 2012

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

  1. Я использую Tomcat 7, который совместим с сервлетом 3.0.

  2. Если вы хотите использоватьв спецификации 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"> 
    
  3. Если вы используете 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 очень сломан, если вы не исправите его с помощью этих строк, особенно части исключения.Происходит то, что JAR-файлы JAR на самом деле используют неверные версии спецификации Servlet - 2.5.Пока вы не остановите это, вы будете в целом мире боли.Отдельное спасибо Мистеру.Мюррей Тодд Уильямс за эти идеи .

  4. Наконец, если 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
    
  5. Обратите внимание!Эта точная конфигурация применяется только в том случае, если вы используете волшебную комбинацию:

    1. Сервер приложений, совместимый с Servlet 3.0, например Tomcat 7

    2. Вашweb.xml имеет правильное пространство имен для спецификации Servlet 3.0

    3. У вас есть эти три JARS и нет других JSTL или JARS сервлетов на вашем пути к классам.

  6. Убедитесь, что вы не размещаете копии этих JAR-файлов в своем каталоге WEB-INF / lib, поскольку в этом случае они будут отправлены на сервер, что приведет к возникновению ошибок LinkageErrors.

  7. В вашем JSP вы должны иметь эту ТОЧНУЮ строку, отформатированную в точности так, как она у меня, иначе Eclipse будет жаловаться, что не распознает теги c: blah:

    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    
  8. Какая проклятая пита!Это НАМНОГО сложнее реализовать, чем любую другую версию JSTL.Это единственный пример того, как что-то становится намного сложнее, а не проще в последующих итерациях.

45 голосов
/ 23 мая 2011

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

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

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

15 голосов
/ 14 сентября 2011

Ваш 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, которые были для предыдущей версии.

Дайте нам знать, как это работает для вас.

5 голосов
/ 23 июля 2014

Для работы на 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>
0 голосов
/ 16 декабря 2015

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

0 голосов
/ 20 сентября 2013

Здесь есть два ответа, которые в основном верны в отношении того, как решить эту проблему при использовании Maven при решении этой проблемы. Однако оба не завершены на 100%.

Использование исключений за @ ответ Тома Хантера

Этот ответ работает. Тем не менее, все еще будут сообщения журнала от Tomcat относительно повторяющихся определений TLD. Это связано с тем, что артефакты 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 для @ ответ Джорджа

Мне потребовалось время, чтобы осознать это, но есть более новые версии JSTL pom. Это действительно сбивает с толку, потому что эти новые пакеты используют похожие, но немного другие соглашения об именах. Эти более новые версии помечают зависимости javax.servlet, javax.jsp и т. Д. Как предоставленную область, поэтому их не нужно исключать. Версия 1.2.1 зависит от версии jstl-api 1.2.1. И вот этот будет работать так же, как и ответ выше:

<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>javax.servlet.jsp.jstl</artifactId>
    <version>1.2.1</version>
    <scope>runtime</scope>
</dependency>

Это немного отличается от ответа Джорджа, потому что я изменил область действия на время выполнения. Джордж уточнил сферу, как это предусмотрено. С предоставленной областью действия файлы jar должны быть скопированы вручную в каталог lib Tomcat, или какая-то другая зависимость должна включать необходимую реализацию.

Однако, Я не смог найти версию impl 1.2.1 в maven central, jboss repo или любых других репо. В итоге я ходил кругами и, наконец, просто использовал локальное файловое хранилище для хранения банок. Зависимость и jar описаны здесь:

0 голосов
/ 07 июня 2013

Следующие зависимости в 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.

Также, если вы видите «Неизвестный тег»

0 голосов
/ 10 мая 2013

Я столкнулся с ошибкой: 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 в Eclipse снова.

0 голосов
/ 29 июля 2012

Для 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, что вполне достаточно.

...