在 Tomcat 7 上的 Servlet 3.0 容器中实现 JSTL 1.2.1



我只是在学习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/libJRE/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>

最新更新