Tomcat容器如何調用service(ServletRequest req, ServletResponse res)
方法? 我可以在哪裏查找此調用的實現?
我怎樣可以看到這req
和res
對象(即傳遞給service()方法)創建?Tomcat容器如何調用service()方法?
回答
雖然Tomcat Architecture頁處於TODO狀態,存在至少到請求處理的UML sequence diagram的鏈接。結合Tomcat的源代碼,這是一個很好的起點。
謝謝,那正是我需要的。 – Warp
的Servlet生命週期是由底層容器控制。一旦servlet被初始化並且有請求,Tomcat將調用servlet的服務方法來處理請求。 服務方法將請求委託給您的Servlet類,您可以訪問doGet或doPost方法中的req和res對象。
public void doGet(HttpServletRequest req, HttpServletResponse res){
}
更新: 1.在從客戶端請求,容器創建兩個對象:HttpServletRequest和HttpServletResponse的。 2.根據請求,Container將找到正確的Servlet(根據URL映射),爲該特定請求創建新線程(一對一映射 - 每個請求的新線程)並調用Servlet的服務方法,傳入已創建HttpServletRequest和HttpServletResponse對象作爲參數。 3.基於請求方法(GET或POST),service()方法將在Servlet中調用doGet()或doPost()方法,再次傳遞相同的HttpServletRequest和HttpServletResponse對象作爲參數。
這些都是簡而言之Servlet的規格。 Tomcat如何執行具體的操作,不受規範控制。如果您需要知道它在Tomcat中的具體實現方式,可以查看它的源代碼。
如果你想知道的話,第一個克隆的Apache Tomcat的源代碼
git clone https://github.com/apache/tomcat.git
然後克隆的倉庫裏,推出這個命令來搜索執行時的service
方法:
grep -H -n -r "\.service(" --include=*.java
你會發現一個簡短的文件列表:
java/javax/servlet/jsp/PageContext.java:107: * in this PageContext until the return from the current Servlet.service()
java/org/apache/catalina/connector/Request.java:3128: // that set towards the start of CoyoyeAdapter.service()
java/org/apache/catalina/core/ApplicationFilterChain.java:231: servlet.service(request, response);
java/org/apache/catalina/servlets/DefaultServlet.java:411: super.service(req, resp);
java/org/apache/catalina/servlets/WebdavServlet.java:349: super.service(req, resp);
java/org/apache/coyote/ajp/AjpProcessor.java:403: getAdapter().service(request, response);
java/org/apache/coyote/AsyncStateMachine.java:41: * been called during a single Servlet.service() method. The
java/org/apache/coyote/AsyncStateMachine.java:58: * been called during a single Servlet.service() method. The
java/org/apache/coyote/http11/Http11Processor.java:498: getAdapter().service(request, response);
java/org/apache/coyote/http2/StreamProcessor.java:257: adapter.service(request, response);
java/org/apache/jasper/Constants.java:41: * HttpJspBase.service(). This is where most of the code generated
java/org/apache/jasper/servlet/JspServlet.java:385: wrapper.service(request, response, precompile);
java/org/apache/jasper/servlet/JspServletWrapper.java:440: servlet.service(request, response);
java/org/apache/jasper/servlet/JspServletWrapper.java:443: servlet.service(request, response);
最感興趣的是一個是java/org/apache/catalina/core/ApplicationFilterChain.java
。你會發現更多的巧合,但其中大部分是因爲有另一個接口進入Tomcat源代碼,它有一個非常類似的方法java/org/apache/coyote/Adapter.java
忽略它。
一旦你java/org/apache/catalina/core/ApplicationFilterChain.java
,您可以編輯,得到了行231和看到那裏的服務方法被調用。
然而,在那個地方不創建兩個req
和res
對象。發現如何創造這些似乎有點複雜,需要更多時間。
- 1. 如何從父容器調用方法
- 2. doGet()或doPost方法如何在內部調用service()方法
- 3. 何時調用Web Service構造函數? [Java Netbeans 6.7.1和Tomcat 6.0.18]
- 4. 如何從「包含」類調用容器類中的方法
- 5. 從JSP調用Tomcat 7方法
- 6. 如何調用控制器的方法
- 7. 如何調用WebApi控制器方法?
- 8. 如何使用IBAction方法調用加速器方法?
- 9. 如何從Jquery調用WCF Ria Service/DomainService?
- 10. 運行tomcat的Docker容器 - 無法連接運行在tomcat容器內的jms
- 11. 如何啓用Tomcat調試
- 12. 通過Tomcat容器過濾器調用幾次
- 13. Maven tomcat插件 - 無法調用Tomcat管理器
- 14. Tomcat-Maven 401錯誤:無法調用Tomcat管理器
- 15. Dropwizard在Tomcat容器
- 16. Ember - 在控制器方法之後如何調用View方法
- 17. 如何從MVC控制器操作方法調用WebApi方法?
- 18. 如何在方法中調用方法?
- 19. 如何調用方法內的方法
- 20. 如何從OnClickListener.onClick方法調用方法?
- 21. 我們應該從Servlet的init()和service()方法中調用destroy()方法嗎?
- 22. Web Service調用在JavaScript在瀏覽器
- 23. Android Service的方法onDestroy在藍牙掃描結束前調用
- 24. Web Service的錯誤路徑屬性必須調用send方法
- 25. Windows Service在關機時從不調用OnStop()方法
- 26. Apache Service Mix部署方法
- 27. 如何調用方法?
- 28. 如何調用方法
- 29. 如何調用該方法?
- 30. 如何調用textfieldDidEndEditing方法
https://github.com/apache/tomcat – PeterMmm