Java 不存在文件/资源的ServletRequest.getRequestDispatcher()

Java 不存在文件/资源的ServletRequest.getRequestDispatcher(),java,servlets,tomcat7,servlet-3.0,requestdispatcher,Java,Servlets,Tomcat7,Servlet 3.0,Requestdispatcher,目前我正在准备JavaEEWeb组件开发人员考试 在《考试学习指南》和ServletAPI Java文档中,我都找到了这种方法 ServletRequest.getRequestDispatcher() 返回 如果servlet容器无法返回RequestDispatcher,则为null 当我尝试使用不存在的静态文件时,实际上得到了非空值。和转发导致404发送到客户端。对于不存在的servlet也有相同的效果。我使用ApacheTomcat7.0 这是否意味着这种行为没有定义,由实现者选择?他们

目前我正在准备JavaEEWeb组件开发人员考试

在《考试学习指南》和ServletAPI Java文档中,我都找到了这种方法

ServletRequest.getRequestDispatcher()

返回

如果servlet容器无法返回RequestDispatcher,则为null

当我尝试使用不存在的静态文件时,实际上得到了非空值。和转发导致404发送到客户端。对于不存在的servlet也有相同的效果。我使用ApacheTomcat7.0


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

这就是Servlet 3.0规范对dispatcher行为的说明:

getRequestDispatcher方法接受一个描述 ServletContext范围内的路径。此路径必须是 相对于ServletContext的根,并以“/”开头,或 空着。该方法使用路径查找servlet,使用 第12章“将请求映射到”中的servlet路径匹配规则 Servlets”,用RequestDispatcher对象包装它,并返回 结果对象如果无法基于给定的 路径,提供了一个RequestDispatcher,用于返回 那条路。

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

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