java - ServletRequest.getRequestDispatcher() 对于不存在的文件/资源

标签 java servlets tomcat7 servlet-3.0 requestdispatcher

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

在考试学习指南和 Servlet API Java 文档中我找到了该方法

ServletRequest.getRequestDispatcher()

返回

null if the servlet container cannot return a RequestDispatcher.

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

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

最佳答案

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

The getRequestDispatcher method takes a String argument describing a path within the scope of the ServletContext. This path must be relative to the root of the ServletContext and begin with a ‘/’, or be empty. The method uses the path to look up a servlet, using the servlet path matching rules in Chapter 12, “Mapping Requests to Servlets”, wraps it with a RequestDispatcher object, and returns the resulting object. If no servlet can be resolved based on the given path, a RequestDispatcher is provided that returns the content for that path.

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

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

关于java - ServletRequest.getRequestDispatcher() 对于不存在的文件/资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15185359/

相关文章:

java - 如何从 Angular 8 组件中的 index.html 获取输入或访问元素?

java - 为什么可以将变量赋值给接口(interface)类型?

java - 作为 if 语句的结果,如何在另一个 react 流中使用一个 react 流

jquery - 在 IE7 中的服务器上呈现时出现奇怪的 JQuery 验证错误 ('this.0.form' 为空或不是对象)

Tomcat 和 CORS 异常

spring-boot - 在 catalina.bat 文件中设置属性与在 setenv.bat 文件中设置属性有什么区别

Java:排序Map<String, ArrayList<String>>类型的Map

javascript - 如何将表单提交的时间发送给servlet?

java - 保持 Vector 的内容完整

java - Tomcat 7 ClassNotFoundException :org. glassfish.jersey.servlet.ServletContainer 问题