我只是在学习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。
索引.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>
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
中没有不同容器品牌/版本的任意JAR文件,例如Tomcat 5.5左右的jsp-api.jar
文件。否则,它只会发生冲突。参见 如何在 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 的类路径。
请不要那样做。只需在/WEB-INF/lib
中丢弃 JSTL JAR 就足够了。还要确保不要在JRE/lib
或JRE/lib/ext
中删除任意特定于 servletcontainer 的 JAR。只是不要触摸这些文件夹。特定于 Web 应用程序的库应该进入/WEB-INF/lib
.如果您使用的是 IDE,它将自动执行所有必要的魔法。您甚至不需要摆弄构建路径属性。CLASSPATH
环境变量仅在命令控制台中运行命令java
使用,即使这样,也仅在没有 -cp
、 -classpath
和 -jar
参数的情况下运行命令时使用。
为了在 apache tomcat 7 上运行,将它们添加到您的 POM 中可能是合适的。这些罐子不像玻璃鱼罐子那样引用javax.servlet罐子,所以不需要排除。
<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>