哪个类为getRequestDispatcher()方法提供实现

时间:2015-07-19 09:47:42

标签: java servlets

getRequestDispatcher() 接口ServletRequest方法返回RequestDispatcher的对象。

我知道getRequestDispatcher()方法位于接口 ServletRequest中。由于它是接口,因此无法定义方法。

此外,此接口再次在另一个接口 HttpServletRequest中继承。但作为一个界面,它不会定义它的方法。

现在,在仔细检查JavaDocs之后,我找不到任何实现这两个接口之一的类,并定义了getRequestDispatcher()方法。

所以我想知道他们在哪里定义了这个方法

提前致谢。

3 个答案:

答案 0 :(得分:3)

每个容器(Tomcat,Jetty等)都有自己的实现HttpServletRequest的类。该类实现了接口的所有方法。该类的一个实例由容器传递给您的servlet。

如果您对此非常好奇,请​​添加

System.out.println(request.getClass());

到你的servlet,你就会知道具体类的名字。

但实际上,你不需要了解它。您需要知道的是它实现了HttpServletRequest接口,从而完成了javadoc和规范中描述的契约。

答案 1 :(得分:2)

TOMCAT 容器的情况下,实现的类是org.apache.catalina.connector.RequestFacade。 实施基本上取决于容器和每个容器都有自己的实现,符合J2EE规范。

使用以下代码检查实现类: -

public class TestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)
            throws ServletException, IOException {
        System.out.println(httpServletRequest.getClass());
    }
}

输出: - org.apache.catalina.connector.RequestFacade

您可以查看此类官方文档here,并可以检查它是否已实施interface javax.servlet.ServletRequest及其getRequestDispatcher()等方法。

答案 2 :(得分:0)

对于jetty v6,它是org.mortbay.jetty.servlet.ServletHandler及其返回org.mortbay.jetty.servlet.Dispatcher实例。

这就是Dispatcher在那里工作的forward

  1. 接受了原始请求,将请求网址替换为新值
  2. 清除输出流。
  3. 通过context.handle(请求,响应)执行请求 - 响应对
  4. 重置请求网址的原始值。