【问题标题】:Implementing JSTL 1.2.1 in a Servlet 3.0 container on Tomcat 7在 Tomcat 7 上的 Servlet 3.0 容器中实现 JSTL 1.2.1
【发布时间】:2012-05-22 01:43:29
【问题描述】:

我刚刚学习 JSP,并且正在 Tomcat 7 上使用 JSTL 进行测试。我能够成功定义和使用自定义标签。但是当我尝试实现 JSTL 时,容器会抛出两个异常。我该如何解决这个问题,以便 jsp 正确翻译?

java.lang.ClassNotFoundException: javax.servlet.jsp.tagext.TagLibraryValidator java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/TagLibraryValidator

我正在使用以下 jar 文件。

javax.servlet.jsp.jstl-1.2.1.jar javax.servlet.jsp.jstl-api-1.2.1.jar

我已将两个 JSTL 1.2.1 jar 放在测试 Web 应用程序的 WEB-INF/lib 和我的 JRE 的 CLASSPATH 中。我还在 Eclipse 的构建路径选项中标记了要导出的两个 jar。

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Insert title here</title>
    </head>
    <body>
        <c:out value="JSTL works."></c:out>
    </body>
</html>

【问题讨论】:

    标签: jsp jstl tomcat7


    【解决方案1】:

    java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/TagLibraryValidator

    这个类是 JSP 2.0 的一部分。 Tomcat 是一个 Servlet 3.0 / JSP 2.2 容器。确保您的 web.xml 被声明为符合 Servlet 3.0。

    <?xml version="1.0" encoding="UTF-8"?>
    <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">
    
        <!-- Config here. -->
    
    </web-app>
    

    而且您的/WEB-INF/lib 中没有来自Tomcat 5.5 左右的jsp-api.jar 等不同容器制造/版本的任意JAR 文件。否则只会发生冲突。另见How do I import the javax.servlet API in my Eclipse project?


    我已经将两个 JSTL 1.2.1 jar 放在了测试 web 应用的 WEB-INF/lib 中

    应该足够了。如果清理web.xml 并且类路径仍然不能解决问题,那么您可能根本没有正确的 JAR。在我们的JSTL wiki page 中,您可以找到指向单个jstl-1.2.jar 文件的下载链接。将其放入 /WEB-INF/lib 并删除其他 JAR。


    和我的 JRE 的 CLASSPATH。

    请不要那样做。只需将 JSTL JAR 放入 /WEB-INF/lib 就足够了。还要确保不要在 JRE/lib 或 JRE/lib/ext 中删除任意特定于 servletcontainer 的 JAR。只是不要触摸这些文件夹。 Webapp 特定的库应该放在/WEB-INF/lib 中。如果您使用的是 IDE,它将自动执行所有必要的魔法。您甚至不需要修改 buildpath 属性。 CLASSPATH 环境变量仅在您在命令控制台中运行 java 命令时使用,即使这样也仅在您在没有 -cp、-classpath 和 -jar 参数的情况下运行它时使用。

    【讨论】:

    • 我的问题是 IDE 没有自动执行任何操作。问题是在我的 CLASSPATH 中包含 JSTL jar,然后在我的 IDE Eclipse 中使用,但不会将它们与 Web 应用程序一起部署。当我将罐子包含在开发环境的 WEB-INF 中时,我会因为有冗余类而出错。最好的选择是将它们作为单独的构建路径库包含在内。然后将该库标记为与依赖项目一起导出。
    • 我从未在 Eclipse 中经历过这样的事情。具有冗余类的错误是由其他原因引起的(并且似乎不是 Eclipse 特定的)。您确定您的项目设置正确吗?顺便说一句,需要删除 JAR 的 /WEB-INF/lib 文件夹。如果您创建了“动态 Web 项目”。
    • 好吧,我使用了我的解决方案,现在 Eclipse 将我的 Web 应用程序部署在已实现的 Tomcat 服务器上就好了。与 mysql JDBC 连接器相同。我还在学习,所以我不确定它现在实际上在做什么,但它都可以可靠地工作并且是可移植的。
    • 向标签添加了 1.2.1 链接 - 我想只需要 javax.servlet.jsp.jstl-1.2.1.jar 吗?
    • 我猜错了 - 两者都需要 - 请查看我的编辑 - 特别是如果 1.2.1 的 servlet 规范上的信息正常的话。我认为添加 1.2.1 的下载链接是强制性的(人们只是对在 wiki 中没有看到 1.2.1 感到困惑——因为它已经发布了很长一段时间了)。
    【解决方案2】:

    对于在 apache tomcat 7 上运行,将这些添加到您的 POM 中可能是合适的。这些 jar 不像 glassfish 那样引用 javax.servlet jar,因此不需要排除。

    <dependency>
        <groupId>org.apache.taglibs</groupId>
        <artifactId>taglibs-standard-spec</artifactId>
        <version>1.2.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.taglibs</groupId>
        <artifactId>taglibs-standard-impl</artifactId>
        <version>1.2.1</version>
    </dependency>
    

    【讨论】:

    • 那些 apache jar 是否等同于 jstl.jar?或等效于 javax.servlet.jsp.jstl-api-1.*.*.jar?
    • 对我来说,这句话的意思是注意。有人可以将所有 JSTL 规范放入一个 jar 中。有些人必须将其拆分为 4 个罐子(apache taglibs 有 4 个罐子可供下载)。我必须一直包括这四个吗?或者 JSTL 规范的哪一部分在四个 jar 中?这四个有什么区别?
    猜你喜欢
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多