Tomcat

Tomcat是什么,Tomcat是目前市场上主流Web服务器之一,是用Java语言开发的项目。Tomcat支持Servlet和JSP的规范,它由一组嵌套的层次和组件组成。结构如下图

所有组件都实现lifecycle生命周期方法,里面包含了init,start,stop,destroy等方法,用来控制生命周期

Server是Tomcat最顶层的容器,代表着整个服务器,即一个Tomcat只有一个Server,Server中包含至少一个Service组件,用于提供具体服务。

Service组件包含了Connector组件和Engine组件,相当于Connector和Engine组件的包装器。一个Server可以包含多个Service(它们相互独立,只是公用一个JVM及类库),一个Service负责维护多个Connector和一个Container。

Connector用于接受请求并将请求封装成Request和Response,然后交给Container进行处理,Container处理完之后在交给Connector返回给客户端。

Engine引擎通是指处理请求的Servlet引擎组件,即Catalina Servlet引擎,它检查每一个请求的HTTP首部信息以辨别此请求应该发往哪个host或context,并将请求处理后的结果返回的相应的客户端。严格意义上来说,容器不必非得通过引擎来实现,它也可以是只是一个容器。如果Tomcat被配置成为独立服务器,默认引擎就是已经定义好的引擎。而如果Tomcat被配置为Apache Web服务器的提供Servlet功能的后端,默认引擎将被忽略,因为Web服务器自身就能确定将用户请求发往何处。一个引擎可以包含多个host组件。

Host,代表一个站点,也可以叫虚拟主机,一个Host可以配置多个Context,在server.xml文件中的默认配置为<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">, 其中appBase=webapps, 也就是<CATALINA_HOME>\webapps目录,unpackingWARS=true 属性指定在appBase指定的目录中的war包都自动的解压,autoDeploy=true 属性指定对加入到appBase目录的war包进行自动的部署。

一个Engine包含多个Host的设计,使得一个服务器实例可以承担多个域名的服务,是很灵活的设计。

Context,代表一个应用程序,就是日常开发中的web程序,或者一个WEB-INF目录以及下面的web.xml文件,换句话说每一个运行的webapp最终都是以Context的形式存在,每个Context都有一个应用路径docBase和请求路径path;

<Context path="/urlpath" docBase="/test/xxx" reloadable=true />

Wrapper是最底层的容器,负责管理一个Servlet,包括加载,初始化,执行和资源回收。创建filter链,调用service方法等。

下面是Tomcat中容器init和start的执行流程

Servlet

Java的Web应用是基于Servlet规范运转的,而Servlet规范的核心接口即是Servlet接口,它是所有Servlet类必须实现的接口,描述了Servlet 生命周期为从创建直到销毁的整个过程,如下

  1. public interface Servlet {
  2. void init(ServletConfig var1) throws ServletException;
  3.  
  4. ServletConfig getServletConfig();
  5.  
  6. void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
  7.  
  8. String getServletInfo();
  9.  
  10. void destroy();
  11. }

init方法

init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。可以在方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。

service方法

service() 方法是执行我们业务逻辑的主要方法。每次有请求到达Servlet时,执行该方法 。

destroy方法

destroy() 方法只会被调用一次,在Servlet 容器关闭时执行 ,此时Servlet 生命周期结束。

在Java Servelt API中已经提供了两个抽象类方便开发者实现Servlet类,分别是GenericServlet 和 HttpServlet,GenericServlet定义了一个通用的、协议无关的Servlet,而HttpServlet则定义了Http协议的Servlet,这两个抽象类可以使Servlet类复用很多共性功能。

我们一般使用的是HttpServlet,重写doGet、doPost方法,实际上是在HttpServlet的service方法里面根据request的method执行对应的doGet、doPost等方法

  1. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  2. String method = req.getMethod();
  3. long lastModified;
  4. if (method.equals("GET")) {
  5. lastModified = this.getLastModified(req);
  6. if (lastModified == -1L) {
  7. this.doGet(req, resp);
  8. } else {
  9. long ifModifiedSince = req.getDateHeader("If-Modified-Since");
  10. if (ifModifiedSince < lastModified) {
  11. this.maybeSetLastModified(resp, lastModified);
  12. this.doGet(req, resp);
  13. } else {
  14. resp.setStatus(304);
  15. }
  16. }
  17. } else if (method.equals("HEAD")) {
  18. lastModified = this.getLastModified(req);
  19. this.maybeSetLastModified(resp, lastModified);
  20. this.doHead(req, resp);
  21. } else if (method.equals("POST")) {
  22. this.doPost(req, resp);
  23. } else if (method.equals("PUT")) {
  24. this.doPut(req, resp);
  25. } else if (method.equals("DELETE")) {
  26. this.doDelete(req, resp);
  27. } else if (method.equals("OPTIONS")) {
  28. this.doOptions(req, resp);
  29. } else if (method.equals("TRACE")) {
  30. this.doTrace(req, resp);
  31. } else {
  32. String errMsg = lStrings.getString("http.method_not_implemented");
  33. Object[] errArgs = new Object[]{method};
  34. errMsg = MessageFormat.format(errMsg, errArgs);
  35. resp.sendError(501, errMsg);
  36. }
  37.  
  38. }

下面是一次请求到达Servlet的过程

参考

https://www.2cto.com/kf/201708/664458.html

https://blog.csdn.net/w1992wishes/article/details/79242797

<深入分析Java  Web技术内幕>

Tomcat和Servlet的更多相关文章

  1. tomcat jdk servlet websocket版本对应关系

    最近在考虑公司主要基础三方库版本统一和升级的问题,特看了下tomcat jdk servlet websocket版本的对应关系,如下:

  2. web服务器、tomcat、servlet是什么?它们之间的关系又是什么?

    今天偶然看到常见web服务器的介绍有Apache HTTP server.Nginx.Microsoft IIS.GWS,心中不禁产生了疑问,这些都是什么呢?一直认为tomcat就是web服务器,以下 ...

  3. WEB服务器,TOMCAT和servlet之间的关系

    WEB服务器,TOMCAT和servlet之间的关系 什么是WEB服务器Web服务器是指能够为发出请求的浏览器提供文档的程序.服务器是 一种被动程序,只有浏览器发出请求的时候才会响应.应用层使用 的是 ...

  4. 浅谈Tomcat和Servlet

    本文浅谈下对Tomcat和Servlet总体的理解,初学时有用过一段时间,但当时疲于应对如何xml配置和使用,对他们的理解就像是一个黑匣子.现在回顾一下帮助自己加深网络的理解.开始还是先推荐我看的文章 ...

  5. 【tomcat】servlet原理及其生命周期

    1.什么是servlet? Servlet(Servlet Applet),全称Java Servlet,是用Java编写的服务器端程序.而这些Servlet都要实现Servlet这个接口.其主要功能 ...

  6. tomcat和servlet的关系

    一.什么是servlet? 处理请求和发送响应的过程是由一种叫做Servlet的程序来完成的,并且Servlet是为了解决实现动态页面而衍生的东西.理解这个的前提是了解一些http协议的东西,并且知道 ...

  7. tomcat(5)servlet容器

    [0]README 0.0)本文部分文字描写叙述转自:"深入剖析tomcat",旨在学习 tomcat(5)servlet容器 的基础知识. 0.1)intro to servle ...

  8. 【转】tomcat与apache,tomcat与servlet的区别

    tomcat与apache的区别:(转自:http://blog.csdn.net/longzs/article/details/10959945) 1.apache支持静态页,tomcat支持动态的 ...

  9. JSP学习 —— 开篇:JSP,servlet容器,Tomcat,servlet容器之间的关系

    JSP(JAVA SERVER PAGE)的缩写,其本身就是servlet的简化,是一种动态网页标准,其特点是在HTML代码中嵌入JAVA代码,JSP标签或用户标签来生成网页.至于它为什么会出现,主要 ...

随机推荐

  1. python基于yield实现协程

    def f1(): print(11) yield print(22) yield print(33) def f2(): print(55) yield print(66) yield print( ...

  2. DataUml Design 教程5-代码模板介绍(甚于T4模板技术)

    DataUml Design 代码模板全然基于C#语言来编写的. 不懂写模板的能够请教作者,随时欢迎. 以下是一段模板代码,这段代码能够获取一个类结构的全部信息.             <#@ ...

  3. io.Writer

    var w io.Writer // 设置为你的 io.Writer var b bytes.Buffer fmt.Fprint(&b, "Hello World") w ...

  4. __name__ = '__main__'有什么用

    很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = ...

  5. hadoop19---动态代理

    Action调用service里面的方法,动态代理:改变方法的实现在方法前后加逻辑不是加新方法. 在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于Io ...

  6. jmeter之报告和分析

    转载:http://www.cnblogs.com/miaomiaokaixin/p/6118081.html jmeter -n -t 脚本名字.jmx -l xxx.jtl -e -o 指定目录( ...

  7. nginx日志分割总结

    nginx日志自己不会进行分个,所有日志都会累积的记录在 access.log,error.log 中,当请求量大,一天就能到几百兆,如果不进行分给,对日志的查看和写入性能都有影响. 1. 编写脚本n ...

  8. 函数:生成1-n的随机数组,

    方法很笨,不过可行: #include <stdio.h> /** 功能:获取一个1-n的随机数数组,这些随机数都互不相同 ** 入参:n-表示最大随机数: *randArray -用于储 ...

  9. 利用MacBookPro入侵无线网络

    目前无线网络的加密方式主要有WEP,WPA/WPA2.这是最常看到的加密方式,最近由于需要,专门去研究了一下如何入侵无线网络. 1.入侵WEP加密的无线网络 WEP加密方式现在已经很不安全了,因为只要 ...

  10. COS-4进程及进程管理

    操作系统是用户和计算机的接口,同时也是计算机硬件和其他软件的接口.操作系统的功能包括管理计算机系统的硬件.软件及数据资源,控制程序运行,改善人机界面,为其它应用软件提供支持,让计算机系统所有资源最大限 ...