为什么servlet jsp的Servlet.service()会抛出这个异常?

问题描述 投票:0回答:6
java jsp
6个回答
39
投票

这可能是由类路径污染引起的。检查您的

/WEB-INF/lib
是否不包含类似
jsp-api-*.jar
的内容。


15
投票

如果您的项目是基于 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>

6
投票

我遇到了这个错误;它有点自发地发生,页面会在浏览器中的 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,填充它,然后返回它。不再出现奇怪的错误。


4
投票

问题出在您的 JSP 中,很可能您正在调用运行时为 null 的对象上的方法。

它发生在 _jspInit() 调用中,这有点不寻常......问题代码可能是像

<%! %>

这样的方法声明

更新:我只是通过重写 _jspInit() 方法来重现这一点。你就是这么做的吗?如果是这样,则不推荐 - 这就是它以 _ 开头的原因。


2
投票

我尽力遵循上面给出的答案。但我有以下相同的理由。

注意:这是针对 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>
  1. 您可能会将 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>
    

0
投票
  1. 确保您的互联网稳定且可访问。

  2. 检查 JRE、源代码、服务器运行时、Web 应用程序库和 EAR 库中的构建路径顺序和导出顺序。

  3. 有时将 WEB-INF/lib 中的所有 jar 添加到构建路径库中。

© www.soinside.com 2019 - 2024. All rights reserved.