Tomcat容器如何调用service()方法?

时间:2017-06-15 14:29:42

标签: java tomcat servlets

Tomcat容器如何调用service(ServletRequest req, ServletResponse res)方法? 我在哪里可以查找此电话的实施情况?
如何查看如何创建此reqres对象(传递给service()方法)?

3 个答案:

答案 0 :(得分:1)

虽然Tomcat Architecture页面处于TODO状态,但至少存在指向请求处理的UML sequence diagram的链接。结合Tomcat的源代码,这是一个很好的起点。

答案 1 :(得分:0)

Servlet生命周期由底层容器控制。一旦servlet被初始化并且有请求,Tomcat将调用servlet的服务方法来处理请求。 Service方法会将请求委托给您的Servlet类,您可以在其中访问doGet或doPost方法中的req和res对象。

public void doGet(HttpServletRequest req, HttpServletResponse res){
}

更新  1.根据客户端的请求,Container创建两个对象:HttpServletRequest和HttpServletResponse。  2.根据请求,Container将找到正确的Servlet(根据URL映射),为该特定请求创建新线程(一对一映射 - 每个请求的新线程)并调用Servlet的服务方法,传入创建的HttpServletRequest和HttpServletResponse对象作为参数。  3.基于请求方法(GET或POST),service()方法将在Servlet中调用doGet()或doPost()方法,再次传递相同的HttpServletRequest和HttpServletResponse对象作为参数。

简而言之,这些是Servlet规范。 Tomcat如何确切地执行特定于实现,它不受规范控制。如果您需要知道它在Tomcat中的实现方式,您可以查看它的源代码。

答案 2 :(得分: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个对象。找到这些是如何创建似乎有点复杂,需要更多的时间。