使用传统的xml形式的SSM实现一遍,描述大致流程
代码地址:
https://gitee.com/chenscript/mybatis_learning.git
前言、tomcat是如何实现servlet的?
将SSM项目用tomcat启动,你会看到日志的第一行是
D:\tomcat8.5.50\apache-tomcat-8.5.50\bin\catalina.bat run
[2019-12-28 10:20:09,678] Artifact SSM:war exploded: Waiting for server connection to start artifact deployment…
Using CATALINA_BASE: “C:\Users\Administrator.IntelliJIdea2017.3\system\tomcat\Unnamed_parent”
Using CATALINA_HOME: “D:\tomcat8.5.50\apache-tomcat-8.5.50”
Using CATALINA_TMPDIR: “D:\tomcat8.5.50\apache-tomcat-8.5.50\temp”
Using JRE_HOME: “D:\Java\jdk1.8.0_161”
Using CLASSPATH: “D:\tomcat8.5.50\apache-tomcat-8.5.50\bin\bootstrap.jar;D:\tomcat8.5.50\apache-tomcat-8.5.50\bin\tomcat-juli.jar”
这里就是我们的入口:catalina.bat 。 在代码里,你会发现实质启动的是tomcat的一个类:Bootstrap。
tomcat Bootstrap源码:
如何调试tomcat源码? --> 直接在Bootstrap中右键运行main()就好了。(记得ant-build一下)
参考链接:
https://blog.csdn.net/yekong1225/article/details/81000446
有些单元测试会报错,但是可以注释掉。
tomcat是最腰间盘突出的设计模式就是状态设计模式(参考start()方法),采用netty方式实现获取请求,发送请求的。
直奔主题吧。tomcat如何实现servlet的?
先看tomcat容器关系图:
来自极客时间的图。
可以看到Servlet是在最底层的,所以跟着代码走,直接找到Wrapper的代码。假设代码使用的是JSP,那么这个Wrapper就是JspServletWrapper。(因为在tomcat代码有这包,方便看代码)
如果认真起来找的话,还追溯到这些类上,跟着上面的图一个个套进去找吧。
可以参考调用栈这里一步步调试。
在JspServlet的init()方法中,核心方法是
wrapper.service(request, response, precompile);<