jsp - the - taglib jstl example




Como instalar o JSTL? O uri absoluto: http://java.sun.com/jstl/core não pode ser resolvido (8)

Não sei o que fiz incorretamente, mas não posso incluir o JSTL. Eu tenho jstl-1.2.jar, mas infelizmente eu recebo exceção:

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)

Eu tenho:

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

org.apache.jasper.JasperException: O uri absoluto: http://java.sun.com/jstl/core não pode ser resolvido nem no web.xml nem nos arquivos jar implementados com este aplicativo

Esse URI é para o JSTL 1.0, mas você está realmente usando o JSTL 1.2 que usa URIs com um caminho /jsp adicional (porque o JSTL, que inventou expressões EL, era desde a versão 1.1 integrada como parte do JSP para compartilhar / reutilizar o EL lógica em JSP simples também).

Então, corrija o URI do taglib de acordo:

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

Além disso, o seu POM também especifica a implementação do JSTL 1.1 do Apache via taglibs:standard . Isso é desnecessário e até mesmo perigoso quando você já possui JSTL 1.2 API + impl empacotado via javax.servlet:jstl , porque 1.1 e 1.2 obviamente entrarão em conflito uns com os outros. Apenas a seguinte dependência do JSTL 1.2 deve fazê-lo para que o JSTL seja instalado na sua aplicação web direcionada ao Tomcat ( não defina o <scope> como provided já que o Tomcat não fornece a caixa!):

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

Os usuários que não são da Maven podem conseguir o mesmo descartando o único arquivo jstl-1.2.jar na pasta /WEB-INF/lib do projeto de aplicativo da web ( não elimine o arquivo standard.jar ou qualquer outro arquivo .tld solto!).

Caso você esteja realmente usando um servidor Java EE normal, como WildFly, Payara, etc, em vez de um servletcontainer barebones como Tomcat, Jetty, etc, não será necessário instalar o JSTL explicitamente. Servidores Java EE normais já fornecem o JSTL fora da caixa. Em outras palavras, você não precisa adicionar o JSTL ao pom.xml nem descartar nenhum arquivo JAR / TLD no webapp. Somente a coordenada do Java EE com escopo definido é suficiente:

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version><!-- 8.0, 7.0, etc depending on your server --></version>
    <scope>provided</scope>
</dependency>

Além disso, você também deve certificar-se de que seu web.xml está declarado em conformidade com o Servlet 2.4 e, portanto, não como Servlet 2.3 ou anterior. Caso contrário, as expressões EL dentro das tags JSTL, por sua vez, não funcionarão. Escolha a versão mais alta que corresponda ao seu contêiner de destino e verifique se você não tem um <!DOCTYPE> em qualquer parte do seu web.xml . Aqui está um exemplo compatível com o 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>

Veja também:


  1. Faça o download do jstl-1.2.jar
  2. Adicione esta diretiva à sua página: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

  3. Cole o arquivo JAR na sua pasta WEB-INF / lib. Isso deve funcionar. (Funcionou para mim.)


Adicione o jstl-1.2.jar na pasta tomcat/lib .

Com isso, seu erro de dependência será corrigido novamente.


Apenas tive problema semelhante no Eclipse corrigido com:

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

algo chutou antes, enquanto eu editava meu pom.xml

Eu tinha todos os arquivos jar necessários, taglib uri e web.xml foi ok


Eu encontrei outro motivo para este tipo de erro: no meu caso, alguém definiu a propriedade conf/catalina.properties configurando tomcat.util.scan.StandardJarScanFilter.jarsToSkip como * para evitar mensagens de aviso de log, ignorando assim a varredura necessária pelo Tomcat. Alterar isso de volta para o padrão do Tomcat e adicionar uma lista apropriada de jars para pular (não incluindo o jstl-1.2 ou o spring-webmvc) resolveu o problema.


Eu mencionei que a dependência do Maven no pom.xml está errada. Deveria ser

    <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>

Resolvido problema semelhante no IBM RAD 7.5 selecionando:

  1. Propriedades de projetos
  2. Facetas do Projeto
  3. Caixa de verificação JSTL

Todas as respostas nesta pergunta me ajudaram, mas eu pensei em adicionar algumas informações adicionais para a posteridade.

Descobri que eu tinha uma dependência de teste em gwt-test-utils que trouxe o pacote gwt-dev . Infelizmente o gwt-dev contém uma cópia completa do Jetty, JSP, JSTL, etc., que estava à frente dos pacotes apropriados no classpath. Portanto, mesmo que eu tivesse dependências adequadas no JSTL 1.2, ele carregaria a versão 1.0 interna para gwt-dev . Resmungar.

A solução para mim foi não executar com o escopo de teste, portanto, eu não escolho o pacote gwt-test-utils em tempo de execução. Removendo o pacote gwt-dev do classpath de alguma outra forma também teria resolvido o problema.