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

时间:2013-03-03 11:53:19

标签: java servlets tomcat7 servlet-3.0 requestdispatcher

目前我正在准备Java EE Web Component Developer考试。

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

ServletRequest.getRequestDispatcher()

返回

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

为null。

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

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

1 个答案:

答案 0 :(得分:2)

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

  

getRequestDispatcher方法采用描述a的String参数   ServletContext范围内的路径。这条路必须是   相对于ServletContext的根,以'/'开头,或者   是空的。该方法使用路径来查找servlet,使用   第12章“映射请求到”中的servlet路径匹配规则   Servlets“,用RequestDispatcher对象包装它,然后返回   结果对象。 如果根据给定的内容无法解析servlet   path,提供一个RequestDispatcher,用于返回内容   那道路。

如果找不到调度路径的匹配servlet,则无处提及返回null。相反,它表示将找到在调度路径中找到的“内容”,我将其翻译为意味着实现可以简单地允许容器绝对解析路径(在您的方案中产生404)

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