Tomcat 7 和 JSTL

2022-08-31 22:44:37

我用Eclipse Tomcat编写了一个Web应用程序,它可以在我本地的Tomcat 7上运行,当我尝试在Tomcat 7上在线发布它时,我遇到了以下错误:

SEVERE: Servlet.service() for servlet [obliquid.servlet.Index] 在上下文中,路径 [/cp] 抛出异常 [绝对 uri: 无法在 web.xml 或与此应用程序一起部署的 jar 文件中解析]http://java.sun.com/jsp/jstl/core

Tomcat 7 有“Spec 版本:Servlet 3.0、JSP 2.2、EL 2.2”,所以 JSTL 不包括在内?

当我尝试上传标准.jar和jstl时.jar我遇到了以下错误:

org.apache.jasper.JasperException: /jsp/index.jsp (line: 3, column: 62) 无法从 JAR 文件 “jndi:/localhost/cp/WEB-INF/lib/standard.jar”: org.apache.jasper.JasperException: Failed to load or instantiate TagLibraryValidator class: org.apache.taglibs.standard.tlv.JstlCoreTLV 读取 TLD “META-INF/c.tld”

我做了一些谷歌搜索,但我无法解决它,有些人说这可能是由冲突版本的罐子引起的。也许我不应该包含这些jar并使用不同的JSTL网址?我的是针对JSTL 1.1的,我认为JSTL 1.2是否有新的URL?

我应该如何解决问题并使此应用程序运行?


答案 1

我已经为此奋斗了几个小时。这是一个完整的解决方案。

  1. 我正在使用Tomcat 7,这是一个符合Servlet 3.0标准的服务器。

  2. 如果您希望使用 Servlet 3.0 规范,则必须按如下方式.xml Web:

    <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_3_0.xsd" version="3.0"> 
    
  3. 如果你使用的是Maven,你的pom.xml应该有这些行。

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.0.1</version>
        <scope>provided</scope>
    </dependency>
    
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
    
    <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>
            <exclusion>
                <artifactId>jstl-api</artifactId>
                <groupId>javax.servlet.jsp.jstl</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    

    这些依赖关系非常重要。JSTL 2.1 + Tomcat 7 + Servlet 3.0 非常损坏,除非您使用这些行修复它,尤其是排除部分。正在发生的是JSTL 2.1 Jars实际上正在拉入Servlet规范的错误版本- 2.5。除非你阻止它发生,否则你将处于一个充满痛苦的世界里。特别感谢Murray Todd Williams先生的这些见解

  4. 最后,如果 Maven 找不到这些 JAR,你可以通过在项目中包含三个 JAR 并执行通常的项目(>属性)来使 Eclipse 满意,> Java Build Path 并以这种方式包含它们--尽管 Maven 应该会处理它。

    javax.servlet-api-3.0.1.jar
    javax.servlet.jsp.jstl-1.2.1.jar
    javax.servlet.jsp.jstl-api-1.2.1.jar
    
  5. 请注意!此确切配置仅适用于以下神奇组合的情况:

    1. 符合 Servlet 3.0 的应用程序服务器,如 Tomcat 7

    2. 您的 web.xml 具有适合 Servlet 3.0 规范的命名空间

    3. 您的类路径上有这三个 JAR,没有其他 JSTL 或 Servlet JAR。

  6. 确保不要将这些 JAR 的副本放在 WEB-INF/lib 目录中,因为在这种情况下,它们将被发送到服务器,从而导致 LinkageErrors。

  7. 在你的JSP中,你需要有这个精确的行,格式完全符合我所拥有的,否则Eclipse会抱怨它不能识别c:blah标签:

    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    
  8. 真是个的皮塔!这比任何其他版本的JSTL都更难实现。这是在以后的迭代中变得更加复杂而不是更简单的唯一示例。


答案 2

Tomcat从未包含JSTL。

你应该把jstl和标准jar放进去(你已经做到了),并确保你有读取它们的权限(chmod)WEB-INF/lib

您的 URI 是正确的,它应该可以正常工作(在此处有效)


推荐