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:
sévère: Servlet.service () pour servlet [obliquid.servlet.Index] dans le contexte de chemin [/cp] a jeté exception [L'uri absolu:
http://java.sun.com/jsp/jstl/core
ne peut pas être résolu dans le web.xml ou les fichiers jar déployé avec cette application]
Tomcat 7 a "Spec versions: Servlet 3.0, JSP 2.2, EL 2.2", donc JSTL n'est pas inclus?
Quand 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) Unable to read TLD "META-INF / c. tld "from JAR file" jndi:/localhost/cp/WEB-INF/lib / standard.jar": org.Apache.Jasper.Jasperexception: N'a pas réussi à charger ou à instancier TagLibraryValidator class: org.Apache.taglibs.norme.tlv.JstlCoreTLV
j'en ai fait googling, mais je n'ai pas pu le démêler, certains ont dit que ça pouvait être causé par des versions contradictoires des pots. Peut-être que je ne devrais pas inclure ces pots et utiliser une url JSTL différente? 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?
9 réponses
Tomcat n'a jamais inclus JSTL.
Vous devriez mettre le jstl et les pots standard dans WEB-INF/lib
(vous l'avez fait), et assurez-vous d'avoir les autorisations pour les lire (chmod)
votre URI est correcte et devrait fonctionner (fonctionne ici)
je me bats avec ce pendant plusieurs heures. Voici une solution complète.
J'utilise Tomcat 7, qui est un serveur compatible Servlet 3.0.
si vous souhaitez utiliser le Servlet 3.0 spec, 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">
si vous utilisez Maven, votre pom.xml devrait avoir 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 importants. JSTL 2.1 + Tomcat 7 + Servlet 3.0 est très cassé à moins que vous ne le corrigiez en utilisant ces lignes, en particulier la partie exclusion. Ce qui se passe, c'est que les jarres JSTL 2.1 tirent en fait les mauvaises versions de la spécification Servlet--2.5. Si vous ne l'empêchez pas, vous souffrirez dans un monde entier. Un merci spécial à M. Murray Todd Williams pour ces idées .
enfin, au cas où Maven ne trouve pas ces pots, vous pouvez rendre Eclipse heureuse en incluant trois pots avec votre projet et faire le projet habituel -- > propriétés -- > Java Build Path et les inclure de cette façon -- bien que Maven devrait s'en occuper.
javax.servlet-api-3.0.1.jar javax.servlet.jsp.jstl-1.2.1.jar javax.servlet.jsp.jstl-api-1.2.1.jar
s'il vous Plaît noter! Cette configuration exacte s'applique uniquement si vous utilisez la combinaison magique de:
un serveur D'application compatible Servlet 3.0 tel que Tomcat 7
votre web.xml a le namespace de droite pour le Servlet 3.0 spec
vous ayez ces trois pots et aucun autre JSTL ou des pots de Servlet sur votre chemin de classe.
assurez-vous de ne pas placer de copies de ces jarres dans votre répertoire WEB-INF/lib car elles seraient alors envoyées au serveur, ce qui causerait des LinkageErrors.
dans votre JSP, vous devez avoir cette ligne précise, formatée exactement comme je l'ai, sinon Eclipse pleurera qu'elle ne reconnaît pas le C: bla balises:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
quelle PITA pendante! C'est beaucoup plus difficile à implémenter 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.
votre uri est correct pour JSTL 1.2. Vous devez faire deux choses :
Modifier web.xml
pour utiliser la dernière web-app version.
Il devrait ressembler à quelque chose comme 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">
Ensuite, mettez la bonne version des bocaux jstl 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 ces, au lieu de standard.jar
et jstl.jar
pour la version précédente.
dites-nous comment cela fonctionne pour vous.
pour courir sur apache tomcat 7 ajouter ces derniers dans votre POM est probablement approprié. Ces pots ne font pas référence à javax.les bocaux à servlet comme ceux à glassfish le font, donc il n'y a 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>
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 ici 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 le travail aussi. Sa seule exigence est Servlet 2.4 et JSP 2.2, et la mention OP Servlet 3.0 et JSP 2.0, ce qui est suffisant.
il y a ici deux réponses qui sont généralement correctes en ce qui concerne la façon de résoudre ce problème lors de L'utilisation de Maven lors du traitement de cette question. Cependant, les deux ne sont pas complètes à 100%.
utilisation D'Exclusions par la réponse de Tom Hunter
Cette réponse œuvres. Cependant, il y aura toujours des messages de Tomcat concernant les définitions de TLD en double. Cela est dû au fait que les artéfacts jstl et jstl-impl comprennent les définitions de TLD. Supprimer ces messages, je pense qu'un meilleur Maven installation est ceci:
<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>
Cela inclut seulement les classes d'api jstl avec les exclusions nécessaires pour éviter les problèmes expliqués dans le reste de cette réponse.
utilisation de nouvelles versions de POM par la réponse de@George
il m'a fallu un certain temps pour le réaliser, mais il y a de nouvelles versions du JSTL pom disponibles. C'est vraiment confus parce que ces nouveaux paquets utilisent les mêmes, mais légèrement différentes conventions de nommage. Ces nouvelles versions marquent le javax.servlet, javax.JSP, etc dépendances selon la portée prévue de sorte qu'elles ne doivent pas être exclues. La version 1.2.1 dépend d'une version 1.2.1 de l'api jstl. Et donc, ce travail ainsi que la réponse ci-dessus:
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.servlet.jsp.jstl</artifactId>
<version>1.2.1</version>
<scope>runtime</scope>
</dependency>
cela diffère légèrement de la réponse de George parce que j'ai changé la portée à l'exécution. George a précisé la portée comme prévu. Avec une portée fournie, les pots devraient être copiés manuellement dans le répertoire lib de 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, JBoss repo, ou tout autre repos. J'ai fini par tourner en rond et finalement j'ai utilisé un fichier local basé sur repo pour stocker le bocal. La dépendance et jar sont décrits ici:
rien de tout cela n'a fonctionné pour moi, j'ai simplement créé le projet sans utiliser Maven et ajouter les fichiers JAR directement.
j'ai souffert de l'erreur: SÉVÈRE: Servlet.service () pour servlet [obliquid.servlet.Index] dans le contexte de chemin [/cp] a jeté exception [L'uri absolu: http://java.sun.com/jsp/jstl/core ne peut pas être résolu dans le web.xml ou les fichiers jar déployé avec cette application] sur Tomcat 7
La Solution: copier les bocaux 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éploie la bibliothèque Tomcat à Eclipse.
Les dépendances suivantes dans le pom.xml semblent résoudre le problème:
<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>
C'était une combinaison étrange - deux groupes différents - mais cela fonctionne :). Je m'attendais à voir le même numéro de groupe pour les deux pots. J'ai pu me redéployer sans problème sur Tomcat 7.
aussi, si vous voyez " unkown tag