原理总结
结构
Tomcat可以分为两大部分:连接器和容器,连接器专门用于处理网络连接相关的事情,如Socket连接、request封装、连接线程池维护等工作,容器用来存放我们编写的网站程序,Tomcat中一共有4层容器:Engine、Host、Context和Wrapper。一个Wrapper对应一个Servlet,一个Context对应一个应用,一个Host对应一个站点,Engine是引擎,一个容器只有一个。Context和Host的区别是Host代表站点,如不同的域名,而Context表示一个应用,比如,默认情况下webapps/ROOT中存放的为主应用,对应一个站点的跟路径,如www.excelib.com。webapps下别的目录则存放别的子应用,对应站点的子路径,如webapps/test目录存放着www.excelib.com/test应用,而所有webapps下的应用都属于同一个站点,它们每一个都对应一个Context,如果想要添加一个新的站点,如blog.excelib.com,则需要使用Host。一套容器和多个连接器组成一个Service,一个Tomcat中可以有多个Service。
Servlet接口一共定义了5个方法,其中init方法和destroy用于初始化和销毁Servlet,整个生命周期中只会被调用一次;service方法实际处理请求;getServletConfig方法返回的ServletConfig,可以获取到配置Servlet时使用init-param配置的参数,还可以获取ServletContext;getServletInfo方法可以获取到一些Servlet相关的信息,如作者、版权等,这个方法需要自己实现,默认返回空字符串。
Java提供了两个Servlet的实现类:GenericServlet和HttpServlet。GenericServlet主要做了三件事情:
1. 实现了ServletConfig接口,让我们可以直接调用ServletConfig中的方法;
2. 提供了无参的init方法;
3. 提供了log方法。
HttpServlet主要做了两件事:
1. 将ServletRequest和ServletResponse转换为了HttpServletRequest和HttpServletResponse;
2. 根据Http请求类型(如Get、Post等)将请求路由到了7个不同的处理方法,这样在编写代码时只需要将不同类型的处理代码编写到不同的方法中就可以了,如常见的doGet、doPost方法就是在这里定义的。
SpringMVC本质是个Servlet,这个Servlet继承自HttpServlet。SpringMVC中提供了三个层次的Servlet:HttpServetBean、FrameworkServlet和DispatcherServlet,它们相互继承,HttpServletBean直接继承自Java的HttpServlet。HttpServlet用于将Servlet中配置的参数设置到相应的属性中,FrameworkServlet初始化了SpringMVC中所使用的WebApplicationContext,具体处理请求的9大组件是在DispatcherServlet中初始化的。整个Servlet继承结构如图: