从tomcat说起全面理解Java web开发原理
简介:Java开发分为Java ME,Java SE,Java EE。回顾过去这些的开发工作基本上都是围绕着Java EE的,在开发经历中分别经历了Java EE开发框架从jsp servlet一路经历了ssh, ssm, springboot mybatis ,spring cloud演化,但是Java web开发过程中web容器却是一路相随tomcat,本篇文章将从tomcat的角度介绍一下http请求的整个链路。
一、servlet
无论是最初的jsp + servlet方式还是现如今的spring boot,web系统都需要基于web服务器才能处理用户请求,Tomcat 是一个免费的、开源的、轻量级的Java Web 应用服务器,Java为了web系统定义了一套servlet规范,tomcat就是遵守servlet规范的servlet容器。
百科的介绍:Servlet是在服务器上运行的小程序。一个Servlet就是一个Java类,并且可以通过“请求-响应”编程模型来访问的这个驻留在服务器内存里的Servlet程序。一般由web容器(例如tomcat)来管理servlet的生命周期。
Servlet定义了如下的规范:
Servlet生命周期:
1.调用 init() 方法初始化
2.调用 service() 方法来处理客户端的请求
3.调用 destroy() 方法释放资源,标记自身为可回收
4.被垃圾回收器回收
二、tomcat
核心功能:分别是负责接收和反馈外部请求的连接器 Connector,和负责处理请求的容器 Container。其中连接器和容器相辅相成,一起构成了基本的 web 服务 Service。每个 Tomcat 服务器可以管理多个 Service。
Tomcat 作为Servlet容器,负责处理客户端请求,把请求传送给Servlet,并将Servlet的响应传送回给客户。Servlet不能独立运行,它必须被部署到Servlet容器中,由容器来实例化和调用 Servlet的方法(如doGet()和doPost()),由Servlet容器管理Servlet的生命周期。
Tomcat处理请求的过程如下:
- 浏览器在请求一个Servlet时,会按照HTTP协议构造一个HTTP请求,通过Socket连接发送给Tomcat
- Tomcat通过不同的IO模型都可以接收到Socket的字节流数据
- 接收到数据后,按HTTP协议解析字节流,得到HttpServletRequest对象
- 再通过HttpServletRequest对象,也就是请求信息,找到该请求对应的Host、Context、Wrapper
- 然后将请求交给Engine层处理
- Engine层处理完,就会将请求交给Host层处理
- Host层处理完,就会将请求交给Context层处理
- Context层处理完,就会将请求交给Wrapper层处理
- Wrapper层在拿到一个请求后,就会生成一个请求所要访问的Servlet实例对象
- 调用Servlet实例对象的service()方法,并把HttpServletRequest对象当做入参
- 从而就调用到Servlet所定义的逻辑
Tomcat核心组件如下图所示;
三、spring MVC
之前写过一篇【三】SpringMVC-执行流程_张狂年少的博客-CSDN博客,这里将重点讲解一下在spring boot微服务架构的方案下http请求是如何到达dispatcherServlet,mvc框架有Struts1,Struts2,spring mvc等,这些框架实际都是一个Servlet,由于spring mvc和spring框架能够无缝集成,并且伴随着spring 不断发展,所以目前spring mvc逐渐替代了其他的产品。
首先我们看一下spring mvc的核心结构图:
没有spring boot之前我们都需要配置一下web.xml,如下所示:
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
现在在spring boot项目中没有web.xml文件,那我们如何去配置一个DispatcherServlet?
这个大家可以去了解一下spring boot的自动装配原理。
spring boot 内置了tomcat,开发web系统需要引入如下包:
可以看到该starter引入了如下包:
当项目启动之后tomcat开始处理请求,由上文介绍的Tomcat处理请求的过程可知,tomcat负责管理servlet。Frameworkservlet 重写 service方法:
这里关注一下
this.processRequest(request, response);
在这个方法里面调用了
this.doService(request, response);
同时DispatcherServlet中实现了doService方法,由此我们找到了http请求是如何到达dispatcherServlet的方式。
总结:本篇文章主要是从tomcat说起全面理解Java web开发原理,Java web开发技术栈一直在升级迭代,但是web容器一直都没有变,我们只有深入理解web容器的原理才能透彻的理解Java web项目运行的原理。