2013-03-03 35 views
2

目前我正在准备的Java EE Web组件开发人员考试。ServletRequest.getRequestDispatcher()为不存在的文件/资源​​

在这两个考试学习指南和Servlet API Java文档我发现方法

ServletRequest.getRequestDispatcher()

回报

NULL,如果servlet容器不能返回一个RequestDispatcher

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

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

回答

2

这是Servlet 3.0规范有什么看法调度行为:

该方法的getRequestDispatcher需要说明的ServletContext范围内的 路径的String参数。此路径必须是 相对于ServletContext的根,并以'/'开头,或者 为空。该方法使用的路径来查找一个servlet,使用第12章的 servlet路径的匹配规则,“将请求映射到 Servlet的”,用一个RequestDispatcher对象包装它,并返回 生成的对象。 如果没有servlet可以根据给定的 路径上得到解决,提供了一个RequestDispatcher返回的 该路径的内容。

如果在调度路径中找不到匹配的servlet,则无处提及返回null。相反,它声明在调度路径中找到的“内容”将被找到,我将其翻译为意思是一个实现可以简单地允许容器绝对解决路径(在您的方案中产生404)。尽管如此,尽管Javadoc似乎可以用最广泛的用例来记录,但是,如果容器由于任何原因不能创建调度器,那么它将返回一个空对象(而不是抛出异常)。这可能是由于实现中的技术问题,或者实际上可能是有效的(例如,JAX-RS实现可以访问某个级别的Servlet基础结构,但不能使用Servlet上下文或调度程序)。