Come installare JSTL? L’uri assoluto: http://java.sun.com/jstl/core non può essere risolto

Non so cosa ho fatto in modo errato, ma non posso includere JSTL. Ho jstl-1.2.jar, ma sfortunatamente ottengo un’eccezione:

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.(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) 

Io ho:

  • pom.xml

      javax.servlet servlet-api 2.5 provided   javax.servlet.jsp jsp-api 2.1 provided   taglibs standard 1.1.2   javax.servlet jstl 1.2  
  • web.xml

      
  • index.jsp

            

    org.apache.jasper.JasperException: l’uri assoluto: http://java.sun.com/jstl/core non può essere risolto in web.xml o nei file jar distribuiti con questa applicazione

    L’URI è per JSTL 1.0, ma in realtà stai usando JSTL 1.2 che usa gli URI con un percorso addizionale /jsp (perché JSTL, che ha inventato le espressioni EL, era integrato dalla versione 1.1 come parte di JSP per condividere / riutilizzare l’EL logica anche in JSP semplice).

    Quindi, correggi l’URI taglib di conseguenza:

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

    Inoltre, il tuo POM specifica l’implementazione JSTL 1.1 di Apache tramite taglibs:standard . Questo non è necessario e persino pericoloso quando hai già installato JSTL 1.2 API + impl in bundle tramite javax.servlet:jstl , perché 1.1 e 1.2 si confronteranno ovviamente tra loro. Solo la seguente dipendenza da JSTL 1.2 dovrebbe fare in modo che JSTL sia installato nella tua webapp con targeting per Tomcat ( non impostare su provided come Tomcat in realtà non fornisce la casella!):

      javax.servlet jstl 1.2  

    Gli utenti non Maven possono ottenere lo stesso facendo cadere il singolo file jstl-1.2.jar nella cartella /WEB-INF/lib del progetto di applicazione Web ( non rilasciare standard.jar o file .tld allentati lì!).

    Nel caso in cui si stia utilizzando un normale server Java EE come WildFly, Payara, ecc. Invece di un servlet container barebone come Tomcat, Jetty, ecc, non è necessario installare JSTL in modo esplicito. I normali server Java EE forniscono già JSTL out the box. In altre parole, non è necessario aggiungere JSTL a pom.xml né eliminare alcun file JAR / TLD in webapp. È sufficiente la coordinata EE Java con ambito provided :

      javax javaee-api  provided  

    Inoltre, dovresti anche assicurarti che il tuo web.xml sia dichiarato conforms almeno a Servlet 2.4 e quindi non come Servlet 2.3 o precedente. Altrimenti le espressioni EL all’interno dei tag JSTL non funzionerebbero a loro volta. Scegli la versione più alta corrispondente al tuo contenitore di destinazione e assicurati di non avere un ovunque nel tuo web.xml . Ecco un esempio compatibile con Servlet 4.0 (Tomcat 9):

         

    Guarda anche:

    • Documentazione taglib di core JSTL (per gli URI taglib giusti)
    • Pagina di informazioni sui tag JSTL (per collegamenti di download JSTL e esempi web.xml )

    @BalusC ha perfettamente ragione, ma se continui a riscontrare questa eccezione, significa che hai sbagliato qualcosa. Le informazioni più importanti che troverai sono nella pagina Info tag SO JSTL .

    Fondamentalmente questo è un riassunto di ciò che devi fare per gestire questa eccezione.

    1. Controlla la versione servlet in web.xml:

    2. Verifica se la versione JSTL è supportata per questa versione servlet: Servlet versione 2.5 utilizza JSTL 1.2 o Servlet versione 2.4 utilizza JSTL 1.1

    3. Il contenitore del servlet deve disporre della libreria appropriata oppure è necessario includerlo manualmente nell’applicazione. Ad esempio: JSTL 1.2 richiede jstl-1.2.jar

    Cosa fare con Tomcat 5 o 6:

    Devi includere i jar appropriati nella tua directory WEB-INF / lib (funzionerà solo per la tua applicazione) o al tomcat / lib (funzionerà globalmente per tutte le applicazioni).

    L’ultima cosa è un taglib nei tuoi file jsp. Per JSTL 1.2 correggere uno è questo:

     <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
     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" %> 

    si prega inoltre di verificare la presenza dei jar di dipendenza in cui sono stati aggiunti javax.servlet.jar e javax.servlet.jsp.jstl-1.2.1.jar o non nella cartella WEB-INF / lib. Nel mio caso questi due hanno risolto il problema.

    1. Scarica jstl-1.2.jar
    2. Aggiungi questa direttiva alla tua pagina: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

    3. Incolla il file JAR nella cartella WEB-INF / lib. Questo dovrebbe funzionare. (Ha funzionato per me.)

    Ho trovato un altro motivo per questo tipo di errore: nel mio caso, qualcuno ha impostato l’impostazione catalina.properties tomcat.util.scan.StandardJarScanFilter.jarsToSkip su * per evitare i messaggi di avviso del registro, saltando così la scansione necessaria da parte di Tomcat. La modifica del valore predefinito di Tomcat e l’aggiunta di un elenco appropriato di jar da saltare (ad esclusione di jstl-1.2 o spring-webmvc) hanno risolto il problema.

    Aggiungi jstl-1.2.jar nella cartella tomcat/lib .

    Con questo, il tuo errore di dipendenza verrà corretto di nuovo.

    Ho menzionato che la dipendenza di Maven nel pom.xml è errata. Dovrebbe essere

       jstl jstl 1.2  

    Volevo solo aggiungere la correzione che ho trovato per questo problema. Non sono sicuro del motivo per cui questo ha funzionato. Ho avuto la versione corretta di jstl (1.2) e anche la versione corretta di servlet-ap (2.5)

      javax.servlet servlet-api 2.5 provided   javax.servlet jstl 1.2  

    Ho anche avuto l’indirizzo corretto nella mia pagina come suggerito in questa discussione, che è

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

    Ciò che ha risolto questo problema per me era la rimozione del tag scope dal mio file xml nel pom per la mia dipendenza da jstl 1.2. Ancora una volta non sono sicuro del motivo per cui è stato corretto, ma nel caso in cui qualcuno stia facendo la molla con il tutorial di JPA e Hibernate su pluralsight e abbia la sua configurazione pom in questo modo, prova a rimuovere il tag scope e verifica se questo lo risolve. Come ho detto, ha funzionato per me.

    Ho distriggersto completamente gli strumenti MAVEN e Spring. E ho dovuto aggiungere i seguenti jar per far funzionare correttamente il mio ambiente.

    • spring-AOP-4.0.3.RELEASE.jar
    • spring-beans-4.0.3.RELEASE.jar (difficile trovare questa correzione, altro org.springframework <3.versions> semplicemente non ha funzionato.
    • spring-context-4.0.3.RELEASE.jar
    • spring-core-4.0.3.RELEASE.jar
    • spring-espressione 4.0.3.RELEASE.jar
    • spring-web-4.0.3.RELEASE.jar
    • spring-webmvc-4.0.3.RELEASE.jar
    • JSTL-1.2.jar

    La cosa peggiore era jstl-api-1.2.jar e javax-servlet.jsp.jst-api-1.2.1.jar . Semplicemente non hanno funzionato.

    `jstl-1.2.jar ha funzionato bene.

    Tutte le risposte in questa domanda mi hanno aiutato ma ho pensato di aggiungere alcune informazioni aggiuntive per i posteri.

    Risultò che avevo una dipendenza di test su gwt-test-utils che portava nel pacchetto gwt-dev . Sfortunatamente gwt-dev contiene una copia completa di Jetty, JSP, JSTL, ecc. Che era in anticipo rispetto ai pacchetti corretti sul classpath. Quindi, anche se avevo delle dipendenze corrette su JSTL 1.2, avrei caricato la versione 1.0 interna a gwt-dev . Brontolare.

    La soluzione per me era di non eseguire con l’ambito del test in modo da non prelevare il gwt-test-utils in fase di runtime. Anche la rimozione del pacchetto gwt-dev dal classpath in qualche altro modo avrebbe risolto il problema.

    Se hai provato tutto ma non è stato d’aiuto, dovresti riavviare il server. Nel mio caso ho appena dimenticato di riavviare Tomcat, dopo aver aggiunto javax.servlet.jsp.jstl-1.2.1.jar alla directory lib .

    Ho appena avuto problemi simili in Eclipse risolti con:

     rightclick on project->Properties->Deployment Assembly->add Maven Dependencies 

    qualcosa lo ha buttato fuori prima, mentre stavo modificando il mio pom.xml

    Avevo tutti i file jar necessari, taglib uri e web.xml era ok

    Risolto problema simile in IBM RAD 7.5 selezionando:

    1. Proprietà dei progetti
    2. Sfaccettature del progetto
    3. JSTL casella di controllo