手撸一个简单的Tomcat,延伸`SpringMvc`的原理
  HwStpnXEg1k1 2023年11月02日 42 0


为什么写这篇文章

一直以来都说tomcat是用的java写的,但是也是不明白到底是怎么弄的,最近有个机会搞明白了,特此记录,可以使得更懂tomcat的原理

用java写一个java的运行程序,听着就很酷,你觉得呢?

整体设计思路

  1. tomcat也是一个java程序,需要开启一个端口号,接收用户请求,当然由于会有很多用户请求到服务端,所以需要把每个请求交给一个线程去处理,否则就会服务端在服务一个用户时堵塞了
  2. 根据用户请求的URL映射到具体的项目servlet(项目的servletweb.xml中有配置)
  3. 执行servletservice方法然后转发到具体的doGet()或者doPost()
  4. 返回浏览器响应

设计图

手撸一个简单的Tomcat,延伸`SpringMvc`的原理_xml

源码设计

1. 使用Socket开启一个端口

开启一个8080端口,在接收到请求时丢到线程池threadPool中执行

手撸一个简单的Tomcat,延伸`SpringMvc`的原理_java_02

2. 根据用户请求的URL映射到具体的项目servlet

具体做的事情就是根据请求的url从保存servletmap中获取一个servlet,然后执行其service(request, response)方法,然后根据http协议构建返回参数返回给客户端

手撸一个简单的Tomcat,延伸`SpringMvc`的原理_tomcat_03


手撸一个简单的Tomcat,延伸`SpringMvc`的原理_xml_04


手撸一个简单的Tomcat,延伸`SpringMvc`的原理_tomcat_05


因为Servletservice方法需要根据请求的Requestmethod方法的返回值来判断是执行doGet还是doPost。故需要设置Requestmethod方法的返回值

手撸一个简单的Tomcat,延伸`SpringMvc`的原理_tomcat_06

3. Servlet的service方法

会根据请求method来判断是执行doGet()还是doPost()

手撸一个简单的Tomcat,延伸`SpringMvc`的原理_tomcat_07

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

手撸一个简单的Tomcat,延伸`SpringMvc`的原理_xml_08


手撸一个简单的Tomcat,延伸`SpringMvc`的原理_tomcat_09

延伸的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正是通过扫码这些注解得知我们项目的请求路径有哪些,进而根据请求路径进行分发请求。


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  2Vtxr3XfwhHq   2024年05月17日   53   0   0 Java
  Tnh5bgG19sRf   2024年05月20日   107   0   0 Java
  8s1LUHPryisj   2024年05月17日   46   0   0 Java
  aRSRdgycpgWt   2024年05月17日   47   0   0 Java
HwStpnXEg1k1