2015-07-19 21 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的原始值。
相關問題