Tomcat 7 et JSTL

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

SEVERE: Servlet.service () pour servlet [obliquid.servlet.Index] en contexte avec path [/ cp] a généré une exception [L’URI absolu: http://java.sun.com/jsp/jstl/core ne peut pas être résolu dans soit les fichiers web.xml ou jar déployés avec cette application]

Tomcat 7 possède des “versions de spécifications: 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 (ligne: 3, colonne: 62) Impossible de lire le TLD “META-INF / c.tld” à partir 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 Google, mais je ne pouvais pas régler le problème, certains ont dit que cela pouvait être dû à des versions contradictoires des bocaux. Peut-être que je ne devrais pas inclure ces pots et utiliser une autre URL JSTL? Le mien 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 exécuter cette application?

Tomcat n’a jamais inclus JSTL.

Vous devriez mettre les fichiers jstl et standard dans WEB-INF/lib (vous l’avez fait) et vous assurer que vous avez les droits pour les lire (chmod)

Votre URI est correct et ça devrait marcher (ça marche ici)

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

  1. J’utilise Tomcat 7, qui est un serveur compatible Servlet 3.0.

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

      
  3. Si vous utilisez Maven, votre pom.xml devrait avoir ces lignes.

      javax.servlet javax.servlet-api 3.0.1 provided   javax.servlet jstl 1.2   org.glassfish.web jstl-impl 1.2   servlet-api javax.servlet   jsp-api javax.servlet.jsp   jstl-api javax.servlet.jsp.jstl    

    Ces dépendances sont très importantes. JSTL 2.1 + Tomcat 7 + Servlet 3.0 est très cassé, sauf si vous corrigez en utilisant ces lignes, en particulier la partie exclusion. Ce qui se passe, c’est que les JSTL 2.1 Jars tirent actuellement les mauvaises versions de la spécification Servlet – 2.5. À moins d’empêcher que cela ne se produise, vous serez dans un monde de douleur. Un merci spécial à M. Murray Todd Williams pour ces idées .

  4. Enfin, si Maven ne trouve pas ces JARS, vous pouvez rendre Eclipse heureux en incluant trois JARS avec votre projet et en faisant le projet habituel -> Propriétés -> Java Build Path et les inclure de cette manière – même si Maven doit prendre en prendre soin.

     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. Notez s’il vous plaît! Cette configuration exacte ne s’applique que si vous utilisez la combinaison magique de:

    1. Un serveur d’applications compatible Servlet 3.0 tel que Tomcat 7

    2. Votre web.xml a le bon espace de noms pour la spécification Servlet 3.0

    3. Vous avez ces trois JARS et aucun autre JSTL ou Servlet JARS sur votre chemin de classe.

  6. Assurez-vous de ne pas placer de copies de ces fichiers JAR dans votre répertoire WEB-INF / lib car ils seraient dans ce cas envoyés au serveur, provoquant ainsi LinkageErrors.

  7. Dans votre JSP, vous devez avoir cette ligne PRECISE, formatée exactement comme je l’ai ou bien Eclipse se plaindre qu’elle ne reconnaît pas les balises c: blah:

     <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
  8. Quel PITA! Ceci est BEAUCOUP plus difficile à implémenter que toute autre version de JSTL. C’est le seul exemple de quelque chose de beaucoup plus compliqué plutôt que plus simple dans les itérations ultérieures.

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

Changez votre web.xml pour utiliser la dernière version de l’application Web.

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

   

Ensuite, mettez la version correcte des jstl jars dans votre code. Pour 1.2 Vous pouvez les télécharger ici .

Cela devrait vous donner deux pots:

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

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

Faites-nous savoir comment cela fonctionne pour vous.

Pour fonctionner sur apache tomcat 7, il est probablement approprié de les append dans votre POM. Ces jars ne font pas référence aux javax.servlet jars comme ceux de glassfish, donc il n’y a pas besoin d’exclusions.

  org.apache.taglibs taglibs-standard-spec 1.2.1   org.apache.taglibs taglibs-standard-impl 1.2.1  

Pour Tomcat, il existe une solution de dépendance plus simple pour JSTL 1.1.2:

  javax.servlet jstl  1.1.2   taglibs standard 1.1.2   taglibs c 1.1.2 tld   taglibs fmt 1.1.2 tld   

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

REM: Plus de détails demandés, il faut inclure les dépendances JSTL pour les rendre disponibles sur Tomcat. Cependant, la version 1.2 n’est pas vraiment nécessaire, car la version 1.1.2 (fournie par Apache, comme Tomcat) fait également 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.

Il y a deux réponses ici qui sont principalement correctes en ce qui concerne la façon de résoudre ce problème lors de l’utilisation de Maven lors de la gestion de ce problème. Cependant, les deux ne sont pas complets à 100%.

Utilisation des exclusions par réponse de @Tom Hunter

Cette réponse fonctionne. Cependant, il y aura toujours des messages de journal de Tomcat concernant les définitions de TLD en double. Cela est dû au fait que les artefacts jstl et jstl-impl incluent tous deux les définitions de TLD. Pour supprimer ces messages, je pense qu’une meilleure configuration de Maven est la suivante:

  1.2 runtime javax.servlet.jsp.jstl jstl-api   servlet-api javax.servlet   jsp-api javax.servlet.jsp     org.glassfish.web jstl-impl 1.2 runtime   servlet-api javax.servlet   jsp-api javax.servlet.jsp   jstl-api javax.servlet.jsp.jstl    

Cela inclut uniquement les classes jstl api avec les exclusions nécessaires pour éviter les problèmes expliqués dans le rest de cette réponse.

Utilisation de nouvelles versions de POM pour la réponse de @ George

Il m’a fallu du temps pour le réaliser, mais il existe de nouvelles versions des pom JSTL. C’est vraiment déroutant car ces nouveaux paquets utilisent des conventions de dénomination similaires, mais légèrement différentes. Ces versions plus récentes marquent les dépendances javax.servlet, javax.jsp, etc. fournies comme telles, de sorte qu’elles n’ont pas besoin d’être exclues. La version 1.2.1 dépend d’une version 1.2.1 du jstl-api. Et ainsi cela fonctionnerait aussi bien que ci-dessus répondez:

  org.glassfish.web javax.servlet.jsp.jstl 1.2.1 runtime  

Cela diffère légèrement de la réponse de George parce que j’ai changé de périmètre en runtime. George spécifie la scope telle que fournie. Avec une étendue fournie, les fichiers JAR devraient être copiés manuellement dans le répertoire lib Tomcat, ou une autre dépendance devrait inclure l’implémentation nécessaire.

Cependant, je n’ai pas pu trouver la version 1.2.1 de l’impl dans maven central, repo jboss, ou tout autre repositionnement. J’ai fini par tourner en rond et j’ai finalement utilisé un repository basé sur des fichiers locaux pour stocker le pot. La dépendance et le pot sont décrits ici:

Aucun de ceux-ci ne fonctionnait pour moi, j’ai simplement créé le projet sans utiliser Maven et append directement les fichiers JAR.

J’ai souffert de l’erreur: SEVERE: Servlet.service () pour servlet [obliquid.servlet.Index] en contexte avec path [/ cp] a lancé une exception [Uri absolu: http://java.sun.com/jsp/jstl / core ne peut pas être résolu dans les fichiers web.xml ou jar déployés avec cette application] sur Tomcat 7

La solution: copiez les fichiers jstl-1.2.jar et javax.servlet.jsp.jstl-api-1.2.1.jar directement dans le répertoire de la bibliothèque Tomcat. Redéployez la bibliothèque Tomcat dans Eclipse.

Les dépendances suivantes dans le fichier pom.xml semblent résoudre le problème:

  org.glassfish.web javax.servlet.jsp.jstl 1.2.1 provided   javax.servlet.jsp.jstl javax.servlet.jsp.jstl-api 1.2.1 provided  

C’était une combinaison étrange – deux groupes différents – mais ça marche :). J’espérais voir le même identifiant de groupe pour les deux pots. J’ai réussi à redéployer sans problème sur Tomcat 7.

Aussi, si vous voyez “tag Unkown