2017-06-15 141 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对象。发现如何创造这些似乎有点复杂,需要更多时间。