175 votes

Comment installer JSTL ? L'uri absolue : http://java.sun.com/jstl/core ne peut être résolue

Je ne sais pas ce que j'ai fait de mal, mais je n'arrive pas à inclure JSTL. J'ai jstl-1.2.jar, mais malheureusement j'obtiens une exception :

org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application
    at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:51)
    at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:409)
    at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:116)
    at org.apache.jasper.compiler.TagLibraryInfoImpl.generateTLDLocation(TagLibraryInfoImpl.java:315)
    at org.apache.jasper.compiler.TagLibraryInfoImpl.<init>(TagLibraryInfoImpl.java:148)
    at org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:429)
    at org.apache.jasper.compiler.Parser.parseDirective(Parser.java:492)
    at org.apache.jasper.compiler.Parser.parseElements(Parser.java:1439)
    at org.apache.jasper.compiler.Parser.parse(Parser.java:137)
    at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:255)
    at org.apache.jasper.compiler.ParserController.parse(ParserController.java:103)
    at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:170)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:332)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:312)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:299)
    at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:586)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
    at java.lang.Thread.run(Thread.java:619)

Je l'ai fait :

  • pom.xml

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.1</version>
      <scope>provided</scope>
    </dependency>
    
    <dependency>
      <groupId>taglibs</groupId>
      <artifactId>standard</artifactId>
      <version>1.1.2</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>
  • 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_2_5.xsd"
      version="2.5">
  • index.jsp

    <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
    <html> 
    <head></head>
    <body></body>
    </html>

7 votes

J'ai dû ajouter la dépendance de taglibs aussi à côté de la jstl et ça a marché.

279voto

BalusC Points 498232

org.apache.jasper.JasperException : L'uri absolu : http://java.sun.com/jstl/core ne peut être résolu ni dans le fichier web.xml ni dans les fichiers jar déployés avec cette application.

Cette URI est pour JSTL 1.0, mais vous utilisez en fait JSTL 1.2 qui utilise des URI avec un élément additionnel /jsp (parce que JSTL, qui a inventé les expressions EL, a été intégré depuis la version 1.1 comme partie intégrante de JSP afin de partager/réutiliser la logique EL dans des JSP simples également).

Donc, fixez l'URI de la taglib en conséquence en vous basant sur Documentation JSTL :

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

En outre, vous devez faire absolument sûr que vous ne jetiez pas plusieurs fichiers JAR JSTL de versions différentes ensemble dans le classpath du runtime. C'est une erreur assez courante chez les utilisateurs de Tomcat. Le problème avec Tomcat est qu'il ne propose pas JSTL par défaut et que vous devez donc l'installer manuellement. Cela n'est pas nécessaire dans les serveurs Jakarta EE normaux. Voir aussi Qu'est-ce que Java EE exactement ?

Dans votre cas spécifique, votre pom.xml vous dit essentiellement que vous avez jstl-1.2.jar et standard-1.1.2.jar ensemble. C'est faux. En fait, vous mélangez JSTL 1.2 API+impl d'Oracle avec JSTL 1.1 impl d'Apache. Vous devriez vous en tenir à une seule implémentation de JSTL.

Installer JSTL sur Tomcat 10+

Si vous êtes déjà sur Tomcat 10 ou une version plus récente (la première version Jakartified, avec jakarta.* au lieu de javax.* ), utilisez JSTL 2.0 via ce paquet sole dépendance :

<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>jakarta.servlet.jsp.jstl</artifactId>
    <version>2.0.0</version>
</dependency>

Les utilisateurs non-Maven peuvent réaliser la même chose en déposant les deux fichiers physiques suivants dans /WEB-INF/lib du projet d'application web (faire absolument pas Laissez tomber le fichier standard*.jar ou tout autre fichier .tld qui s'y trouve (supprimez-les si nécessaire).

Installation de JSTL sur Tomcat 9-

Si vous n'êtes pas encore sur Tomcat 10, mais toujours sur Tomcat 9 ou plus ancien, utilisez JSTL 1.2 comme suit sole (ceci est compatible avec Tomcat 9 / 8 / 7 / 6 / 5 mais pas plus ancien) :

<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>jakarta.servlet.jsp.jstl</artifactId>
    <version>1.2.6</version>
</dependency>

Les utilisateurs non-Maven peuvent réaliser la même chose en déposant les deux fichiers physiques suivants dans /WEB-INF/lib du projet d'application web (faire absolument pas Laissez tomber le fichier standard*.jar ou tout autre fichier .tld qui s'y trouve (supprimez-les si nécessaire).

Installation de JSTL sur un serveur JEE normal

Si vous utilisez un serveur Jakarta EE normal, tel que WildFly, Payara, TomEE, GlassFish, WebSphere, OpenLiberty, WebLogic, etc., au lieu d'un conteneur de services de base tel que Tomcat, Jetty, Undertow, etc., vous n'avez pas besoin d'installer explicitement JSTL. Serveurs Jakarta EE normaux déjà fournit JSTL dès le départ. En d'autres termes, il n'est pas nécessaire d'ajouter JSTL à l'application. pom.xml ni de déposer des fichiers JAR/TLD dans la webapp. Seul le provided La coordination de l'EE Jakarta est suffisante :

<dependency>
    <groupId>jakarta.platform</groupId>
    <artifactId>jakarta.jakartaee-api</artifactId>
    <version><!-- 9.0.0, 8.0.0, etc depending on your server --></version>
    <scope>provided</scope>
</dependency>

Assurez-vous que la version de web.xml est correcte

En outre, vous devez également vous assurer que votre web.xml est déclaré conforme al menos Servlet 2.4 et donc pas comme Servlet 2.3 ou plus ancien. Sinon, les expressions EL à l'intérieur des balises JSTL ne fonctionneraient pas. Choisissez la version la plus élevée correspondant à votre conteneur cible et assurez-vous que vous n'avez pas de fichier <!DOCTYPE> n'importe où dans votre web.xml . Voici un exemple compatible avec Servlet 5.0 (Tomcat 10) :

<?xml version="1.0" encoding="UTF-8"?>
<web-app 
    xmlns="https://jakarta.ee/xml/ns/jakartaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
    version="5.0">

    <!-- Config here. -->

</web-app>

Et voici un exemple compatible avec Servlet 4.0 (Tomcat 9) :

<?xml version="1.0" encoding="UTF-8"?>
<web-app
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    version="4.0">

    <!-- Config here. -->

</web-app>

Voir aussi :

0 votes

J'ai changé pour /jsp et : org.apache.jasper.JasperException : L'uri absolu : java.sun.com/jsp/jstl/core ne peut être résolu dans aucun des deux web.xml ....

4 votes

Alors votre classpath est un désordre. Nettoyez-le. Je ne sais pas ce que fait maven et si c'est intelligent, mais pour JSTL 1.2 il faut ne pas besoin de la standard taglib. Lisez la page d'information sur les tags pour plus de détails.

4 votes

J'aime beaucoup la page wiki JSTL que vous avez créée. Cependant, comme cette question est le premier résultat de Google pour ce message d'erreur particulier, je prends la liberté de l'éditer et de noter que l'URI "non-jsp" provient de JSTL 1.0.

36voto

smas Points 8299

@BalusC a tout à fait raison, mais si vous rencontrez toujours cette exception, cela signifie que vous avez fait quelque chose de mal. L'information la plus importante que vous trouverez se trouve sur le site SO Informations sur les étiquettes JSTL page.

Il s'agit essentiellement d'un résumé de ce que vous devez faire pour traiter cette exception.

  1. Vérifiez la version du servlet dans le fichier web.xml : <web-app version="2.5">

  2. Vérifier si la version de JSTL est supportée pour cette version de servlet : Version du servlet 2.5 utilise JSTL 1.2 ou la version du servlet 2.4 utilise JSTL 1.1

  3. Votre conteneur de servlets doit disposer de la bibliothèque appropriée, ou vous devez l'inclure manuellement dans votre application. Par exemple : JSTL 1.2 requiert jstl-1.2.jar

Que faire avec Tomcat 5 ou 6 :

Vous devez inclure le(s) jar(s) approprié(s) dans votre répertoire WEB-INF/lib (cela ne fonctionnera que pour votre application) ou dans tomcat/lib (cela fonctionnera globalement pour toutes les applications).

La dernière chose est un taglib dans vos fichiers jsp. Pour JSTL 1.2, le bon est celui-ci :

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

3 votes

J'ai remarqué que cette question est assez populaire (beaucoup de téléspectateurs). C'est pourquoi j'ai décidé d'écrire un petit tutoriel sur la façon de résoudre ce problème.

15voto

streethawk Points 41
jstl-1.2.jar --> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
jstl-1.1.jar --> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>

Veuillez également vérifier les bocaux de dépendance que vous avez ajoutés. javax.servlet.jar y javax.servlet.jsp.jstl-1.2.1.jar ou pas dans votre dossier WEB-INF/lib. Dans mon cas, ces deux éléments ont résolu le problème.

0 votes

Pouvez-vous s'il vous plaît jeter un coup d'œil à la question ici[ stackoverflow.com/questions/44039706/

0voto

Gray Points 58585

Toutes les réponses à cette question m'ont aidé mais j'ai pensé ajouter quelques informations supplémentaires pour la postérité.

Il s'est avéré que j'avais un test dépendant de gwt-test-utils qui a fait entrer le gwt-dev paquet. Malheureusement, gwt-dev contient une copie complète de Jetty, JSP, JSTL, etc. qui était en avance sur les paquets appropriés dans le classpath. Ainsi, même si j'avais les dépendances appropriées sur JSTL 1.2, il chargeait la version 1.0 interne de gwt-dev . Grondement.

La solution pour moi a été de ne pas exécuter avec la portée de test de sorte que je ne ramasse pas la gwt-test-utils au moment de l'exécution. La suppression du gwt-dev du classpath d'une autre manière aurait également réglé le problème.

-2voto

c. hantzis Points 1

Résolution d'un problème similaire dans IBM RAD 7.5 en sélectionnant :

  1. Propriétés des projets
  2. Facettes du projet
  3. Case à cocher JSTL

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