2

目前我正在准备 Java EE Web 组件开发人员考试。

在考试学习指南和 Servlet API Java 文档中,我发现了该方法

ServletRequest.getRequestDispatcher()

返回

如果 servlet 容器不能返回 RequestDispatcher,则为 null

当我用不存在的静态文件尝试它时,我实际上得到了非空值。并转发导致 404 发送给客户端。对于不存在的 servlet 也有同样的效果。我使用 Apache Tomcat 7.0。

这是否意味着这种行为没有定义并且由实施者选择?他们(Java 文档作者)所说的“servlet 容器不能返回 RequestDispatcher”是什么意思?我试图在 JSR 规范中寻找它,但无法找到答案。

4

1 回答 1

2

这就是 Servlet 3.0 规范对调度程序行为的规定:

getRequestDispatcher 方法接受一个 String 参数来描述 ServletContext 范围内的路径。此路径必须相对于 ServletContext 的根目录并以“/”开头,或者为空。该方法使用路径查找 servlet,使用第 12 章“将请求映射到 Servlet”中的 servlet 路径匹配规则,用 RequestDispatcher 对象包装它,并返回结果对象。如果无法根据给定路径解析任何 servlet,则提供一个返回该路径内容的 RequestDispatcher。

如果无法为调度路径找到匹配的 servlet,它没有提到返回 null。相反,它声明将找到在调度路径中找到的“内容”,我将其翻译为意味着实现可以简单地允许容器绝对解析路径(在您的场景中会产生 404)。

不过,就 Javadoc 而言,它似乎记录了最广泛的用例,也就是说,如果容器由于任何原因无法创建调度程序,那么它将返回一个空对象(而不是引发异常)。这可能是由于实现中的技术问题,或者可能实际上是有效的(例如,JAX-RS 实现可以访问某种级别的 Servlet 基础结构,但不能使用 servlet 上下文或调度程序)。

于 2013-03-03T12:18:29.820 回答