44 votes

Tomcat 7 et JSTL

J'ai écrit une application web avec Eclipse Tomcat et elle fonctionne sur mon Tomcat 7 local, quand j'ai essayé de la publier en ligne sur un Tomcat 7, j'ai eu l'erreur suivante :

SEVERE : Servlet.service() for servlet [obliquid.servlet.Index] in context with path [/cp] threw exception [The absolute uri : http://java.sun.com/jsp/jstl/core ne peut être résolu ni dans le web.xml ni dans les fichiers jar déployés avec cette application].

Tomcat 7 a "Spec versions : Servlet 3.0, JSP 2.2, EL 2.2", donc JSTL n'est pas inclus ?

Lorsque j'ai essayé de télécharger standard.jar et jstl.jar, j'ai eu l'erreur suivante :

org.apache.jasper.JasperException : /jsp/index.jsp (line : 3, column : 62) Impossible de lire le TLD "META-INF/c.tld" du fichier JAR "jndi:/localhost/cp/WEB-INF/lib/standard.jar" : org.apache.jasper.JasperException : Impossible de charger ou d'instancier la classe TagLibraryValidator : org.apache.taglibs.standard.tlv.JstlCoreTLV

J'ai fait quelques recherches sur Internet, mais je n'ai pas pu résoudre le problème. Certains ont dit que cela pouvait être causé par des versions contradictoires des bocaux. Peut-être que je ne devrais pas inclure ces jars et utiliser une autre url JSTL ? La mienne est pour JSTL 1.1 je pense, y a-t-il une nouvelle URL pour JSTL 1.2 ?

Que dois-je faire pour résoudre le problème et faire fonctionner cette application ?

55voto

Tom Hunter Points 321

Je me suis battu avec ce problème pendant plusieurs heures. Voici une solution complète.

  1. J'utilise Tomcat 7, qui est un serveur conforme à la norme Servlet 3.0.

  2. Si vous souhaitez utiliser la spécification Servlet 3.0, vous devez avoir votre web.xml comme suit :

    <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. Si vous utilisez Maven, votre pom.xml doit contenir ces lignes.

    <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>

    Ces dépendances sont très importantes. JSTL 2.1 + Tomcat 7 + Servlet 3.0 est très cassé à moins que vous ne le répariez en utilisant ces lignes, en particulier la partie exclusion. Ce qui se passe, c'est que les Jars JSTL 2.1 tirent en fait les mauvaises versions de la spécification Servlet - 2.5. À moins que vous n'empêchiez cela de se produire, vous serez dans un monde de douleur. Un grand merci à M. Murray Todd Williams pour ces informations. .

  4. Enfin, au cas où Maven ne trouverait pas ces JARS, vous pouvez rendre Eclipse heureux en incluant trois JARS dans votre projet et en effectuant les opérations habituelles Project--> Properties--> Java Build Path et les inclure de cette façon - bien que Maven devrait s'en charger.

    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. Attention ! Cette configuration exacte ne s'applique que si vous utilisez la combinaison magique de :

    1. Un serveur d'application conforme à Servlet 3.0 tel que Tomcat 7

    2. Votre web.xml possède le bon espace de nom pour la spécification Servlet 3.0.

    3. Vous avez ces trois JARS et aucun autre JARS JSTL ou Servlet dans votre classpath.

  6. Veillez à ne pas placer de copies de ces JAR dans votre répertoire WEB-INF/lib, car elles seraient dans ce cas envoyées au serveur, ce qui provoquerait des LinkageErrors.

  7. Dans votre JSP, vous devez avoir cette ligne PRÉCISE, formatée exactement comme je l'ai fait, sinon Eclipse se plaindra qu'il ne reconnaît pas les balises c:blah :

    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  8. Quel putain de PITA ! C'est BEAUCOUP plus difficile à mettre en œuvre que n'importe quelle autre version de JSTL. C'est le seul exemple de quelque chose qui devient beaucoup plus compliqué plutôt que plus simple dans les itérations ultérieures.

45voto

Bozho Points 273663

Tomcat n'a jamais inclus JSTL.

Vous devriez mettre les jars jstl et standard dans WEB-INF/lib (vous l'avez fait), et assurez-vous que vous avez les permissions pour les lire (chmod)

Votre URI est correct et cela devrait fonctionner (fonctionne ici)

14voto

Vikas Chaudhary Points 151

Votre uri est correcte pour JSTL 1.2. Vous devez faire deux choses :

Changez votre web.xml pour utiliser la dernière version de la web-app.

Il devrait ressembler à ceci ou à une version ultérieure ;

<?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">

Deuxièmement, mettez la version correcte des jars jstl dans votre code. Pour la version 1.2, vous pouvez les télécharger aquí .

Cela devrait vous donner deux bocaux :

  • jstl-api.jar
  • jstl-impl.jar

Utilisez-les, au lieu de standard.jar y jstl.jar qui étaient pour la version précédente.

Faites-nous savoir comment cela fonctionne pour vous.

5voto

Nicholas Points 78

Pour le fonctionnement sur apache tomcat 7, ajouter ces éléments dans votre POM est probablement approprié. Ces bocaux ne font pas référence aux bocaux javax.servlet comme le font ceux de glassfish, il n'y a donc pas besoin d'exclusions.

<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>

0voto

JVerstry Points 12414

Pour Tomcat, il existe une solution de dépendance plus simple pour 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>

Voir aquí pour plus de détails (blog personnel).

REM : Plus de détails comme demandé, il faut inclure les dépendances JSTL pour les rendre disponibles sur Tomcat. Pourtant, la version 1.2 n'est pas vraiment nécessaire, puisque la version 1.1.2 (fournie par Apache, comme Tomcat) fait aussi le travail. Sa seule exigence est Servlet 2.4 et JSP 2.2, et l'OP mentionne Servlet 3.0 et JSP 2.0, ce qui est suffisant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X