2015-07-19 23 views
2

getRequestDispatcher()方法ServletRequest接口返回RequestDispatcher的对象。哪个类提供getRequestDispatcher()方法的实现

我知道getRequestDispatcher()方法是在接口ServletRequest。因为它是一个接口,它不会定义该方法。

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

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

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

感谢。

回答

2

执行的类是org.apache.catalina.connector.RequestFacade,如果是TOMCAT容器。 实现基本上依赖容器&每个容器都有自己的实现遵守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()等。

+0

public void service(ServletRequest req,ServletResponse res)throws IOException,ServletException {res.setContentType(“text/html”); PrintWriter out = res.getWriter(); out.print(“”); out.print(req.getClass()); out.print(“”); } 输出: - ''org.apache.catalina.connector.RequestFacade'尝试使用此代码,给出了不同的类名 –

+0

OP询问ServletRequest#getRequestDispatcher(),而不是ServletContext#getRequestDispatcher()。 @probuddhasingha你为什么接受答案? – hzpz

+0

@probuddhasingha类'org.apache.catalina.connector.RequestFacade'是正确的,它是'javax.servlet.ServletRequest'的实现# –

3

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

如果你真的很好奇,添加

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

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

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

0

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

这是怎么forward从调度员的工作有:

  1. 花了原来的要求,新的价值
  2. 清除输出流代替请求的URL。
  3. 通过上下文执行请求响应对。处理(请求,响应)
  4. 重置请求URL的原始值。
相关问题