2017-06-15 27 views
2

Tomcat容器如何調用service(ServletRequest req, ServletResponse res)方法? 我可以在哪裏查找此調用的實現?
我怎樣可以看到這reqres對象(即傳遞給service()方法)創建?Tomcat容器如何調用service()方法?

+0

https://github.com/apache/tomcat – PeterMmm

回答

0

的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中的具體實現方式,可以查看它的源代碼。

+0

我理解,但究竟是如何服務()被調用? 如何創建發送到此服務方法的對象? 像是這樣的tomcat代碼 'ServletRequest request = new ServletRequest(); ServletResponse responce = new ServletResponse(); request.doStuff(): responce.doStuff(): 服務(請求,響應) ' – Warp

+0

我已更新我的答案。 – fg78nc

0

如果你想知道的話,第一個克隆的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和看到那裏的服務方法被調用。

然而,在那個地方不創建兩個reqres對象。發現如何創造這些似乎有點複雜,需要更多時間。

相關問題