1

I am just learning JSP and am testing using JSTL on Tomcat 7. I am able to successfully define and use custom tags. But when I attempt to implement JSTL the container throws two exceptions. How can I fix this so the jsp will translate properly?

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

I'm using the following jar files.

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

I have placed the two JSTL 1.2.1 jars in WEB-INF/lib of the test web app and the CLASSPATH for my JRE. I have also marked the two jars for export in the build path options in Eclipse.

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

2 回答 2

4

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>

此外,您jsp-api.jar/WEB-INF/lib. 否则只会发生冲突。另请参阅如何在我的 Eclipse 项目中导入 javax.servlet API?


我已将两个 JSTL 1.2.1 jar 放在测试 Web 应用程序的 WEB-INF/lib 中

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


和我的 JRE 的 CLASSPATH。

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

于 2012-05-14T14:59:35.737 回答
0

对于在 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>
于 2014-07-23T17:44:09.187 回答