Tomcat容器如何调用service(ServletRequest req, ServletResponse res)
方法?
我在哪里可以查找此电话的实施情况?
如何查看如何创建此req
和res
对象(传递给service()方法)?
答案 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行并查看调用服务方法的位置。
但是,在该位置不会创建req
和res
个对象。找到这些是如何创建似乎有点复杂,需要更多的时间。