目前我正在准备Java EE Web Component Developer考试。
在考试学习指南和Servlet API Java文档中,我找到了方法
ServletRequest.getRequestDispatcher()
返回
如果servlet容器无法返回RequestDispatcher ,则为null。
当我尝试使用不存在的静态文件时,我实际上得到了非null值。并且前进导致404发送给客户。对于不存在的servlet也有相同的效果。我使用的是Apache Tomcat 7.0。
这是否意味着此行为未定义并留给实施者选择?他们(Java文档作者)的意思是“servlet容器无法返回RequestDispatcher”?我试图在JSR规范中寻找它,但无法找到答案。
答案 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上下文或调度程序)。