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. 何时调用Web Service构造函数? [Java Netbeans 6.7.1和Tomcat 6.0.18]
- 2. 如何使用IBAction方法调用加速器方法?
- 3. 运行tomcat的Docker容器 - 无法连接运行在tomcat容器内的jms
- 4. 如何从Jquery调用WCF Ria Service/DomainService?
- 5. 通过Tomcat容器过滤器调用几次
- 6. 如何启用Tomcat调试
- 7. Maven tomcat插件 - 无法调用Tomcat管理器
- 8. 我们应该从Servlet的init()和service()方法中调用destroy()方法吗?
- 9. Web Service调用在JavaScript在浏览器
- 10. Windows Service在关机时从不调用OnStop()方法
- 11. 如何调用方法
- 12. 如何调用textfieldDidEndEditing方法
- 13. 如何调用该方法?
- 14. 如何调用SOAP方法?
- 15. 如何调用js_of_ocaml方法?
- 16. 如何调用java方法
- 17. 如何调用'popoverControllerDidDismissPopover'方法?
- 18. 如何调用queryAll方法
- 19. 如何调用类方法
- 20. 如何调用方法
- 21. 如何调用displayAd()方法?
- 22. 如何调用方法?
- 23. 如何调用remove()方法?
- 24. Apache Service Mix部署方法
- 25. Java方法容器
- 26. 如何在Service Worker中使用POST http方法?
- 27. Rhino Mocks:如何在方法调用中模拟方法调用?
- 28. 如何在Symfony中的config中调用服务容器中的方法?
- 29. 如何从DialogFragment获取日期每当onDateSet方法调用到容器片段
- 30. 如何从usercontrol调用aspx内容页面方法? ASP.NET,C#
https://github.com/apache/tomcat – PeterMmm