【问题标题】:Cannot get Tomcat 8.0 with Servlet 3.1 working with JSTL 1.2无法让 Tomcat 8.0 与 Servlet 3.1 一起使用 JSTL 1.2
【发布时间】:2015-12-09 09:16:03
【问题描述】:

我几乎通读了关于 SO 的这个问题的所有答案,并尝试了十几种不同的“解决方案”,但我无法让 JSTL 在 Tomcat 8.0 中使用 servlet 3.1 的 Spring Boot Web 应用程序中工作。我继续收到此错误:

The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application.

我使用 Maven 构建项目,但也手动复制了 JAR,希望能有所帮助,但可惜没有!我希望我只是忽略了一些愚蠢的事情。有人可以告诉我我做错了什么吗?

我尝试过的事情(对于所有这些,这是一个简单的 index.jsp 文件中包含的行 -

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  1. 在我的 pom.xml 中添加了以下依赖项(移除 XML 字符以更好地格式化)

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

    这会将 jstl-1.2.jar 放在我的 WEB-INF/lib 目录中,并且当我部署到 Tomcat 时我已经确认它在那里 - 这不起作用

  2. 根据此处的建议删除上述依赖项并添加这些依赖项 (http://www.murraywilliams.com/2011/11/running-jstl-1-2-on-tomcat-7-using-maven/)

    <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>
       </exclusions>
    </dependency>
    

    这会在我的 WEB-INF/lib 目录中添加两个额外的 JAR 文件,一个 jstl-api-1.2.jar 和 jstl-impl-1.2.jar,当我部署到 Tomcat 时我已经确认它们在那里 - 这不会不工作

  3. 我还尝试将每个依赖项的范围更改为“提供”,同时将相应的 JAR 放在 Tomcat 的 lib 目录中并重新启动 Tomcat,但仍然无法正常工作。

这是我的 web.xml 标头

<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_3_1.xsd"
         version="3.1">

无论如何,非常感谢任何帮助!

【问题讨论】:

  • 你是在暗示不使用 Spring Boot 时它可以正常工作吗?
  • 不,但我知道 Spring Boot 在幕后做了很多事情,我觉得提到它的使用可能是相关的。虽然我确实在我的项目上运行了一个依赖树,但没有看到其他 JAR 引入冲突的 JSTL JAR。
  • 我不想发布这个问题的答案,因为它并没有真正回答实际问题,但我决定使用 Thymeleaf 来处理视图而不是 JSP。只有一个小的学习曲线,它与 Spring 4(和 Spring Boot)集成得非常好。我会鼓励其他人也做出改变!

标签: jsp spring-boot jstl tomcat8 servlet-3.1


【解决方案1】:

你不应该使用提供的范围,因为 tomcat 没有 jstl 库

【讨论】:

    【解决方案2】:

    我认为您只需将组 id 从 javax.servlet.jsp.jstl 更改为 javax.servlet 如下所示。

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

    【讨论】:

    • 有人可以评论一下为什么这个回复是负面的吗?给定的问题通过这种方法得到了解决,因此我认为应该提供一个有效的理由并给出否定标记。
    【解决方案3】:

    尝试检查 Tomcat 的 catalina.properties 文件。找到名为tomcat.util.scan.StandardJarScanFilter.jarsToScan 的设置。添加 taglib jar 的名称。就我而言,我添加了taglibs*.jar,因为我的罐子被称为taglibs-standard-impl-1.2.5.jartaglibs-standard-spec-1.2.5.jar

    如果catalina.propertiesjarsToSkip 设置中有很多jar,则可能找不到标记库,因此将它们添加到jarsToScan 可以修复它。 Tomcat专家,如果我理解不正确,请纠正。但是,这已经为我解决了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-17
      • 1970-01-01
      • 2016-06-19
      • 2012-06-26
      • 2013-04-07
      • 2019-01-31
      相关资源
      最近更新 更多