HttpServlet請求響應過程(繼承HttpServlet類的Servlet,Tomcat容器)

Servlet容器在收到客戶機請求的時候,首先會解析請求url,根據web.xml的配置,去找到對應的servlet。若是沒有找到對應的servlet,服務器有一個默認Servlet的配置項,位於$CATALINA_HOME/conf/web.xml中被全局聲明(也就是說你項目下的web.xml文件裏沒有)。容器會檢查請求的servlet是否被實例化,若是沒有,建立一個servlet實例:程序員

容器會調用過濾器ApplicationFilterChain的doFilter(ServletRequest request, ServletResponse response)方法,源碼在此省略,裏面有兩處截圖以下:web

--------------------------------------------------------------------服務器

而後,分兩種可能。第一種是沒有對應的servlet,此時,容器會先調用HttpServlet的service方法,在這裏將ServletRequest對象和ServletResponse對象強轉爲HttpServletRequest對象和HttpServletResponse對象,再調用DefaultServlet實例的service方法,具體代碼稍微複雜,可是若是是不存在的servlet,則會響應404。第二種是有對應的servlet,容器則先調用HttpServlet的service方法,在這裏將ServletRequest對象和ServletResponse對象強轉爲HttpServletRequest對象和HttpServletResponse對象,再調用實例的service方法,假若程序員重寫了service方法,則按照程序員寫的來。假若程序員沒有重寫,則調用父類(HttpServlet類)的service方法:post

而默認的service方法,會根據請求的類型,調用不一樣的方法。url

其實,這些do開頭的方法,也都是protected方法,換句話說,也是須要程序員重寫的。若是客戶端發來一次post請求,程序員既沒有重寫service(HttpServletRequest req, HttpServletResponse resp)方法,也沒有重寫doPost(HttpServletRequest req, HttpServletResponse resp)方法,那麼就調用默認的doPost方法,以下所示:3d

能夠看到,在默認的doPost方法中,Tomcat容器根據協議的類型,給客戶機提示405或者400。若是程序員重寫了doPost方法,那麼就按照程序員寫的執行,若是沒有重寫,則響應405或者400。xml

相關文章
相關標籤/搜索