这可能是由类路径污染引起的。检查您的
/WEB-INF/lib
是否不包含类似 jsp-api-*.jar
的内容。
如果您的项目是基于 Maven 的,请记住将 servlet-api、jsp-api 等依赖项的范围设置为provided。否则,这些 jars 将被导出到 WEB-INF/lib 并因此与 Tomcat 服务器中的 jars 污染。这会导致痛苦的问题。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
我遇到了这个错误;它有点自发地发生,页面会在浏览器中的 HTML 标记(而不是代码段)中间停止。真是令人费解!
结果是,我让一个变量超出了范围,垃圾收集器将其清除,然后我尝试使用它。因此看似随机的时间。
举一个更具体的例子......在一个方法中,我有类似的东西:
Foo[] foos = new Foo[20];
// fill up the "foos" array...
return Arrays.asList(foos); // this returns type List<Foo>
现在在我的 JSP 页面中,我调用该方法并使用它返回的 List 对象。 List 对象由“foos”数组支持;但是,当我从方法返回时,数组超出了范围(因为它是局部变量)。返回后不久,垃圾收集器清除了“foos”数组,并且我对 List 的访问导致了 NullPointerException,因为它的底层数组现在已被清除。
我实际上想知道,当我写上面的方法时,是否会发生这种情况。
更深层的根本问题是过早优化。我想要一个列表,但我知道我正好有 20 个元素,所以我想我会尝试比
new ArrayList<Foo>(20)
更高效,它只设置初始大小 20,但可能比我使用的方法效率低。当然,为了解决这个问题,我只是创建了 ArrayList,填充它,然后返回它。不再出现奇怪的错误。
问题出在您的 JSP 中,很可能您正在调用运行时为 null 的对象上的方法。
它发生在 _jspInit() 调用中,这有点不寻常......问题代码可能是像
<%! %>
这样的方法声明
更新:我只是通过重写 _jspInit() 方法来重现这一点。你就是这么做的吗?如果是这样,则不推荐 - 这就是它以 _ 开头的原因。
我尽力遵循上面给出的答案。但我有以下相同的理由。
注意:这是针对 maven+eclipse+tomcat 部署和尤其是 spring mvc 所面临的问题。
1- 如果您包含 servlet 和 jsp 依赖项,请在范围内标记它们。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
<scope>provided</scope>
</dependency>
您可能会将 jstl 作为依赖项包含在内。因此,
jsp-api.jar
和 servlet-api.jar
将一起包含在内。因此,需要排除在目标或“WEB-INF/lib”中作为所需库部署的 servlet-api 和 jsp-api,如下所示。
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</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>
</exclusions>
</dependency>
确保您的互联网稳定且可访问。
检查 JRE、源代码、服务器运行时、Web 应用程序库和 EAR 库中的构建路径顺序和导出顺序。
有时将 WEB-INF/lib 中的所有 jar 添加到构建路径库中。