为什么写这篇文章
一直以来都说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,有请求过来会先打到DispatcherServletSpringMvc要做的事情就是通过这个DispatcherServlet把请求分发到我们自己的写的Servlet 我们需要在请求的Controller上写明@RequestMapping("path"),而SpringMvc正是通过扫码这些注解得知我们项目的请求路径有哪些,进而根据请求路径进行分发请求。










