如何安装JSTL?绝对的uri:http://java.sun.com/jstl/core无法解决

luk*_*ymo 124 jsp servlets jstl

我不知道我做错了什么,但我不能包括JSTL.我有jstl-1.2.jar,但不幸的是我得到了例外:

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)
Run Code Online (Sandbox Code Playgroud)

我有:

  • 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>
    
    Run Code Online (Sandbox Code Playgroud)
  • 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">
    
    Run Code Online (Sandbox Code Playgroud)
  • index.jsp

    <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
    <html> 
    <head></head>
    <body></body>
    </html>
    
    Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 176

org.apache.jasper.JasperException:绝对uri:http://java.sun.com/jstl/core无法在web.xml或使用此应用程序部署的jar文件中解析

该URI适用于JSTL 1.0,但您实际上使用的是JSTL 1.2,它使用带有附加/jsp路径的URI (因为发明EL表达式的JSTL自1.1版本集成为JSP的一部分,以便共享/重用EL逻辑)普通的JSP也是如此).

因此,请相应地修复taglib URI:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
Run Code Online (Sandbox Code Playgroud)

此外,您的POM还通过指定Apache的JSTL 1.1实现taglibs:standard.当你已经捆绑了JSTL 1.2 API + impl时,这是不必要的甚至是危险的javax.servlet:jstl,因为1.1和1.2显然会相互冲突.只是只有以下JSTL 1.2依赖应该这样做,以安装在你的Tomcat针对性的webapp JSTL(也设置<scope>provided比如Tomcat居然不提供开箱!):

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

非Maven用户可以实现通过降低单相同JSTL-1.2.jar文件/WEB-INF/lib的Web应用程序项目的文件夹(你降standard.jar或有任何松动.TLD文件!).

如果你实际上使用的是普通的Java EE服务器,比如WildFly,Payara等,而不是像Tomcat,Jetty等那样的准系统servlet容器,那么你根本不需要显式安装JSTL.普通的Java EE服务器已经提供了JSTL.换句话说,您不需要添加JSTL pom.xml也不需要删除webapp中的任何JAR/TLD文件.仅仅provided作用域的Java EE坐标就足够了:

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version><!-- 8.0, 7.0, etc depending on your server --></version>
    <scope>provided</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)

另外,你也应该确保你的web.xml声明符合至少 Servlet 2.4和因此不作为的Servlet 2.3或以上.否则,JSTL标记内的EL表达式将无法工作.选择与目标容器匹配的最高版本,并确保您的<!DOCTYPE>任何地方都没有web.xml.这是一个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>
Run Code Online (Sandbox Code Playgroud)

也可以看看:

  • 然后你的类路径是一团糟.清理它.我不知道maven在做什么以及它是否聪明,但对于JSTL 1.2,你**不需要`标准`taglib.阅读标签信息页面了解更多详情. (4认同)
  • 我非常喜欢你放在一起的JSTL wiki页面.但是,由于这个问题是Google针对特定错误消息的最大问题,我正在冒昧地编辑它并注意"非jsp"URI来自JSTL 1.0. (4认同)
  • @kdgregory:谢谢:) (2认同)

luk*_*ymo 36

@BalusC是完全正确的,但是如果你仍然遇到这个例外,那就意味着你做错了什么.您将在SO JSTL标签信息页面上找到最重要的信息.

基本上,这是处理此异常需要执行的操作的摘要.

  1. 检查web.xml中的servlet版本: <web-app version="2.5">

  2. 检查此servlet版本是否支持JSTL版本:Servlet版本2.5使用JSTL 1.2或Servlet版本2.4使用JSTL 1.1

  3. 您的servlet容器必须具有相应的库,或者必须在应用程序中手动包含它.例如:JSTL 1.2需要jstl-1.2.jar

如何处理Tomcat 5或6:

您需要在WEB-INF/lib目录中包含适当的jar(它只适用于您的应用程序)或tomcat/lib(适用于所有应用程序的全局工作).

最后一件事是你的jsp文件中的taglib.对于JSTL 1.2,正确的是:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Run Code Online (Sandbox Code Playgroud)

  • 我注意到这个问题很受欢迎(许多观众).所以这就是我决定写简短教程如何处理这个问题的原因 (3认同)

res*_*nbl 16

我发现了这种类型错误的另一个原因:在我的情况下,有人将catalina.properties设置conf/catalina.properties属性设置tomcat.util.scan.StandardJarScanFilter.jarsToSkip为避免日志警告消息,从而跳过Tomcat进行必要的扫描.将其更改回Tomcat默认值并添加适当的jars列表(不包括jstl-1.2或spring-webmvc)解决了这个问题.

  • 如果您不想更改“jarsToSkip”设置,则在其下方有一个“jarsToScan”设置,该设置会覆盖“jarsToSkip”中的任何内容。我们最终将“taglibs*.jar”添加到“jarsToScan”中,因为我们的标签库是“taglibs-standard-impl-1.2.5.jar”和“taglibs-standard-spec-1.2.5.jar”。 (2认同)
  • 这是对我有用的答案。在 `conf/catalina.properties` 中,我将 `tomcat.util.scan.StandardJarScanFilter.jarsToSkip=*.jar` 更改为 `tomcat.util.scan.StandardJarScanFilter.jarsToScan=jstl*.jar` 并修复了它。 (2认同)

小智 14

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" %>
Run Code Online (Sandbox Code Playgroud)

也请检查您已经添加的依赖罐子javax.servlet.jarjavax.servlet.jsp.jstl-1.2.1.jar或不是在你的WEB-INF/lib文件夹.在我的情况下,这两个解决了这个问题.


Pra*_*ire 9

  1. 下载jstl-1.2.jar
  2. 将此指令添加到您的页面: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

  3. 将JAR文件粘贴到WEB-INF/lib文件夹中.这应该工作.(它对我有用.)


Had*_*uli 8

添加jstl-1.2.jartomcat/lib文件夹中.

这样,您的依赖性错误将再次修复.


Joh*_*Eye 6

2021年的答案

这个问题仍然很受欢迎,但所有答案都严重过时了。所有 Java EE 组件都被拆分到各个 Jakarta 项目中,JSTL 也不例外。以下是目前为止正确的 Maven 依赖项:

<dependency>
    <groupId>jakarta.servlet.jsp.jstl</groupId>
    <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
    <version>1.2.7</version>
</dependency>
<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>jakarta.servlet.jsp.jstl</artifactId>
    <version>1.2.6</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

是的,版本和 groupId 不匹配,但这是项目当前状态的一个怪癖


小智 5

我只是想添加我找到的针对此问题的修复程序。我不知道为什么这有效。我有正确版本的 jstl (1.2) 以及正确版本的 servlet-api (2.5)

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

正如此线程中所建议的,我的页面中也有正确的地址,即

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Run Code Online (Sandbox Code Playgroud)

解决这个问题的方法是从 pom 中的 xml 文件中删除 jstl 1.2 依赖项的范围标记。再次不确定为什么会修复它,但以防万一有人在pluralsight 上使用 JPA 和 Hibernate 进行 spring 教程并以这种方式进行 pom 设置,请尝试删除范围标签,看看是否可以修复它。就像我说的,这对我有用。