为什么写这篇文章
一直以来都说tomcat是用的java写的,但是也是不明白到底是怎么弄的,最近有个机会搞明白了,特此记录,可以使得更懂tomcat的原理
用java写一个java的运行程序,听着就很酷,你觉得呢?
整体设计思路
tomcat
也是一个java
程序,需要开启一个端口号,接收用户请求,当然由于会有很多用户请求到服务端,所以需要把每个请求交给一个线程去处理,否则就会服务端在服务一个用户时堵塞了- 根据用户请求的URL映射到具体的项目
servlet
(项目的servlet
在web.xml
中有配置) - 执行
servlet
的service
方法然后转发到具体的doGet()
或者doPost()
- 返回浏览器响应
设计图
源码设计
1. 使用Socket开启一个端口
开启一个8080端口,在接收到请求时丢到线程池threadPool
中执行
2. 根据用户请求的URL映射到具体的项目servlet
具体做的事情就是根据请求的url
从保存servlet
的map
中获取一个servlet
,然后执行其service(request, response)
方法,然后根据http
协议构建返回参数返回给客户端
因为Servlet
的service
方法需要根据请求的Request
的method
方法的返回值来判断是执行doGet
还是doPost
。故需要设置Request
的method
方法的返回值
3. Servlet
的service
方法
会根据请求method来判断是执行doGet()
还是doPost()
3. 看看ServletMapping
是怎么来的
不知道你还记不记得,如果不使用springmvc等框架,是需要把Servlet
写到web.xml
中的
<servlet>
<servlet-name>servlet1</servlet-name>
<servlet-class>org.whatisjava.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet1</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
所以我们可以通过加载项目的web.xml
来得到所有的servlet
延伸的SpringMvc
原理
其实看懂了上面tomcat
的原理,SpringMvc
的原理也呼之欲出了,不知道你还记得不记得如果使用的SpringMvc
,你需要在web.xml
中配置一个DispatcherServlet
<servlet>
<!-- 配置DispatcherServlet -->
<servlet-name>springMvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定spring mvc配置文件位置 不指定使用默认情况 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-mvc.xml</param-value>
</init-param>
<!-- 设置启动顺序 -->
<load-on-startup>1</load-on-startup>
</servlet>
DispatcherServlet
一般被称为中央处理器,其实他也是个Servlet
,有请求过来会先打到DispatcherServlet
SpringMvc
要做的事情就是通过这个DispatcherServlet
把请求分发到我们自己的写的Servlet
我们需要在请求的Controller
上写明@RequestMapping("path")
,而SpringMvc
正是通过扫码这些注解得知我们项目的请求路径有哪些,进而根据请求路径进行分发请求。