前言

曾几何时,我们使用springboot后使用内置的tomcat项目进行启动项目,但是这里是如何集成的可能我们并不清楚,本文发表一些笔者的理解和看法

在这里先抛出一些原生Tomcat作为web服务器的知识,Tomcat称之为web容器,也可以称之为servlet容器,原因如下:

  • web容器:用来与我们的浏览器做交互,即与http请求做交互
  • servlet容器:与http请求做交互的时候,如何调用我们的业务代码呢?这个时候就需要我们的servlet规范了,各个web容器厂商只要实现servlet规范,即可制作自己的web容器了。而我们的业务代码也可以基于servlet规范下进行我们的业务代码调用了。

servlet规范也就是我们常见的servlet-api.jar中定义的规范了,在原生tomcat里面也是默认加载了该jar包。

springboot

在我们的springboot中使用了内置的tomcat,servlet规范也使用了自己的类,主要类即ervlet.java类,代码如下:

public interface Servlet {

    public void init(ServletConfig config) throws ServletException;

    public ServletConfig getServletConfig();

    public void service(ServletRequest req, ServletResponse res)
            throws ServletException, IOException;

    public String getServletInfo();

    public void destroy();
}

主要也就是以上几个方法,最关键的即是service方法来处理我们的业务代码,这个类在servlet-api中也是这么定义的。

这就是我们的Servlet规范了

传统项目

在我们以前使用springmvc的项目中都会在web.xml中配置DispatcherServlet,也就是把我们任意的请求全部转发给DispatcherServlet的service

<servlet-name>dispatcherServlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-mvc.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>dispatcherServlet</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>
DispatcherServlet

DispatcherServlet间接的实现了Servlet接口,实现了servlet规范,也就是我们只要在配置文件中定义DispatcherServlet,那么所有请求都可以转发到DispatcherServlet中

在springboot中我们不在配置DispatcherServlet了,而是又springboot的自动装配来默认装载,自动装配的原理在此不做介绍,简单的说就是默认加载META-INF/spring.factories定义的类,然后我们就可以在spring.factories中找到我们的关键类DispatcherServletAutoConfiguration

springboot集成echarts springboot集成tomcat_java


在DispatcherServletAutoConfiguration里面有这么一个bean

@Bean(name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
	public DispatcherServlet dispatcherServlet() {
		DispatcherServlet dispatcherServlet = new DispatcherServlet();
		dispatcherServlet.setDispatchOptionsRequest(
				this.webMvcProperties.isDispatchOptionsRequest());
		dispatcherServlet.setDispatchTraceRequest(
				this.webMvcProperties.isDispatchTraceRequest());
		dispatcherServlet.setThrowExceptionIfNoHandlerFound(
				this.webMvcProperties.isThrowExceptionIfNoHandlerFound());
		dispatcherServlet.setEnableLoggingRequestDetails(
				this.httpProperties.isLogRequestDetails());
		return dispatcherServlet;
	}

这里也就可以看出来springboot默认创建了一个DispatcherServlet来处理http请求

总结

通过上面分析,大致流程如下

  1. 通过自动装配默认加载了DispatcherServlet,所有请求都会转发到DispatcherServlet
  2. DispatcherServlet的doService方法中拿到HttpServletRequest和HttpServletResponse对象
    从HttpServletRequest可以拿到我们的http头、url请求等信息
  3. 根据获取的信息,从ioc容器中找到对应的Controller对应的action,进行反射调用
  4. 根据HttpServletResponse返回调用结果给浏览器渲染

看到这个流程,相信大家对应tomcat处理http请求的流程就会有一个清晰的了解了,而springboot中的内置tomcat,基本组件都是参考自原生Tomcat的,即使我们自己写一个简易的tomcat来处理请求也不是什么难事。

以上就是笔者对springboot中tomcat处理的一些见解!