精华内容
下载资源
问答
  • tomcat底层原理
    2020-01-31 22:17:51

    一、Tomcat原理总结

    1. Tomcat需要main方法启动。
    2. Tomcat需要监听本机上的某个端口。
    3. Tomcat需要抓取此端口上来自客户端的链接并获得请求调用的方法与参数。
    4. Tomcat需要根据请求调用的方法,动态地加载方法所在的类,完成累的实例化并通过该实例获得需要的方法最终将请求传入方法执行。
    5. 将结果返回给客户端(jsp/html页面、json/xml字符串)

    二、Tomcat运行原理分析

    1. Tomcat是运行在JVM中的一个进程。它定义为【中间件】,顾名思义,是一个在Java项目与JVM之间的中间容器。
    2. Web项目的本质,是一大堆的资源文件和方法。Web项目没有入口方法(main方法),,意味着Web项目中的方法不会自动运行起来。
    3. Web项目部署进Tomcat的webapp中的目的是很明确的,那就是希望Tomcat去调用 写好的方法去为客户端返回需要的资源和数据。
    1. Tomcat可以运行起来,并调用写好的方法。那么,Tomcat一定有一个main方法。
    2. 对于Tomcat而言,它并不知道我们会有什么样的方法,这些都只是在项目被部署进webapp下后才确定的,由此分析,必然用到了Java的反射来实现类的动态加载、实例化、获取方法、调用方法。但是我们部署到Tomcat的中的Web项目必须是按照规定好的接口来进行编写,以便进行调用
      6.Tomcat如何确定调用什么方法呢。这取决于客户端的请求,http://127.0.0.1:8080/Test.Tomcat.Study/index.java?show这样的一个请求,通过http协议,在浏览器发往本机的8080端口,携带的参数show方法,包含此方法的路径为Test.Tomcat.Study,文件名为:index.java。

    tomcat
      |—bin:存放启动和关闭tomcat脚本
      |—conf:存放不同的配置文件(server.xml和web.xml);
      |—doc:存放Tomcat文档;
      |—lib/japser/common:存放Tomcat运行需要的库文件(JARS);
      |—logs:存放Tomcat执行时的LOG文件;
      |—src:存放Tomcat的源代码;
      |—webapps:Tomcat的主要Web发布目录(包括应用程序示例);
      |—work:存放jsp编译后产生的class文件;

    服务器端(tomcat):
    1、使用SocketServer创建一个套接字连接服务。
    2、监听端口号,例如这里的8080端口。
    3、通过套接字服务,获取inputStream输入流,可以理解为request。
    4、通过输入流(request)获取请求的信息。
    5、处理获取出来的输入流信息,使用反射生成访问的处理类对象,用来调用访问的方法。
    6、通过套接字得到outputStream输出流,可以理解成response,通过输出流给出响应信息。

    客户端(浏览器访问):
    1、使用Socket创建一个连接,访问一个路径和一个端口号,也就是用户在浏览器中输入网址的过程。
    2、使用socket获取输出流,这里的输出流可以理解成request对象。
    3、如果要获取发服务器响应的内容则通过,socket获取inputStream输入流,读取管道中的数据就可以。

    更多相关内容
  • Tomcat底层原理

    千次阅读 2019-11-06 11:02:21
    一、Tomcat启动时到底对我们的应用程序做了什么? 当我们把一个应用程序的war包放到Tomcat的webapps目录后,启动Tomcat,然后就可以通过浏览器发送Http请求访问该war包内的Servlet了。 这个过程包括: 1、启动...

    一、Tomcat启动时到底对我们的应用程序做了什么?

    当我们把一个应用程序的war包放到Tomcat的webapps目录后,启动Tomcat,然后就可以通过浏览器发送Http请求访问该war包内的Servlet了。
    这个过程包括:
    1、启动Tomcat
    2、Tomcat处理Http请求
    而启动Tomcat的目的就是为了处理Http请求。

    一个Http请求通常是这样子的:
    http://localhost:8080/app/helloServlet
    这个请求包括:

    协议:http
    主机名:localhost
    端口:8080
    应用名:app
    Servlet名:helloServlet
    

    我们通俗点来理解这个Http请求就是:浏览器通过Http协议,请求localhost:8080上的myapp应用内的helloServlet。

    Tomcat架构俯视图:

    在这里插入图片描述

    二、那分析这个Http请求有什么用呢?和Tomcat有什么关系?

    当然有关系,上面这个Http请求中的localhost:8080其实代表的就是Tomcat。我们一个应用程序想要从外部接收网络数据,那就要绑定一个端口,这个跟TCP协议有关系,外部请求发送给该端口,就能被对于的程序所接收到。Tomcat也是这样,所以,Tomcat默认绑定的就是8080。

    所以上面这个Http请求首先是被Tomcat接收到,然后去解析这个请求。
    解析这个请求包括:

    请求所使用的方法,是GET,还是POST,还是其他
    所请求的应用与Servlet的名字是什么
    请求所携带的数据
    

    当Tomcat把从8080端口获取的请求解析完成后,它就应该根据应用名和Servlet名字去找Servlet实现类了,只有找到Servlet实现类才能真正执行Servlet里面的doGet或doPost方法。

    所以,这里又分两步:

    根据请求中的应用名和Servlet名怎么找到对应的Servlet实现类呢
    怎么执行Servlet实现类中跟请求对应的方法呢
    

    首先关于第二点,很简单:可以用***反射***
    那么对于第一点该怎么实现呢?
    其实也很简单,要么默认,要么映射。
    默认的意思就是,请求中的Servlet名就是类名,这种可行,但是不好用,一个类还有包名的,万一在一个应用中,存在不同的包下存在名字相同的Servlet,这个时候就尴尬了。
    所以最好的方式就是映射,一个Servlet名对应一个Servlet实现类。这也就是为什么我们在定义Servlet时,一定要做一个mapping关系,不管是通过@WebServlet注解还是在web.xml中,都需要配置一个mapping才能被访问到。

    所以,Tomcat通过监听端口,获取数据,然后解析数据,根据请求url找到对应的Servlet实现类,然后通过反射执行Servlet实现类中的方法

    这个流程并不难,如果我们自己实现,30分钟内可能就能实现出来这么一个功能,这也是Tomcat的主线功能,那么Tomcat复杂在哪呢?
    其实还是复杂在这条主线,这条主线再拆分一下就是两步:

    获取并解析数据
    寻找并执行Servlet
    

    在这里插入图片描述

    tomcat容器对比:
    在这里插入图片描述

    三、Servlet

    我们在来细想一下这里的第二步:寻找并执行Servlet

    我们通常说Tomcat是一个Servlet容器,到底体现在哪,怎么体现的呢?
    我们得先来理解一下Servlet,Servlet=Server+Applet,表达的意思就是运行在服务端的应用程序,它跟运行在客户端的应用程序是相对的,运行在客户端的应用程序,可以随着用户的操作而发生变化,而运行在服务端的应用程序,用户是不能直接操作的,你只能通过发送网络请求来操作它,这就是Servlet的由来。这也就是为什么Servlet规范里会定义ServletRequest,ServletResponse接口,都是跟请求相关的,所以,Servlet其实就为Java程序员方便处理请求和响应的一种抽象,作为Java程序员,你只需要通过定义Servlet,然后接收到的ServletRequest对象就代表请求,而不用关心ServletRequest具体的实现类是什么,是谁实现的,都不用关系,只要知道这个对象代表一个请求即可。
    所以谁来实现这些接口呢?大家自然就能想到了,是Tomcat、Jetty这些了。比如Tomcat中对应的请求实现类是RequestFacade,我们在Servlet中进行强制转化是没有问题的,比如这么写:

    @Override
    
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
        RequestFacade requestFacade = (RequestFacade) req;
    
        resp.getWriter().println("luban annotation servlet");
    
    }
    

    我们重新理解了Servlet之后,就可以再来理解Tomcat了,Tomcat确实是一个容器,但是是一个分层的容器。因为一个Servlet代表一个功能,一个应用中可以有多个Servlet,所以在Tomcat中存在Context容器,Context容器中收纳Servlet,Context就代表应用,也就是应用上下文,然后我们的应用是部署在主机上的,所以Tomcat中存在Host容器,一个Host容器中可以容纳多个Context容器,再继续,我们可能是多个主机所提供的功能属于同一范畴的,所以在Tomcat中,在Host之上还有一层Engine。所以我们说的容器包括:Engine、Host、Context。

    而Tomcat除开实现了这个层级结构之外,还提供了一些辅助功能。
    既然现在容器分层了,所以一个请求在寻找Servlet的过程中,就会经过每一层容器,那么每层容器在这个过程中都可以去做一些事情,并且允许用户自定义这些事情,比如可以在Host层去指定:所有请求该Host的请求都将日志打印到hostname.log文件中,或者所有请求该Host的请求都由该Host添加一下参数,其他容器也类似,这其实就是一种责任链模式,Tomcat中实现了这种模式,是通过:Pipeline和Valve实现的。

    好,这是关于容器的分析。
    接下来我们再来分析一下Tomcat是怎么解析请求的,上文我们分析了,Tomcat实际上就是把接收到的请求转化成RequestFacade对象,最后把这个对象传递给Servlet。
    那么Tomcat的数据从哪来的呢?上文中我们一直默认Tomcat接收的是Http请求,那么这个Http请求是怎么到达Tomcat的呢?总不是凭空飞过来了的吧。
    大家应该想到了,是通过网线传过来的,所以我们要分析Tomcat是怎么接收到Http请求,就要分析网络传输协议了。
    首先,我们为什么需要网络传输协议呢?
    网络是用来传输数据的,比如现在主机A有一份数据要发送给主机B,那么主机A在拥有数据的同时还是要知道主机B的地址,也就是IP,所以现在相当于主机A上要有:数据+对方IP地址

    四、流程图

    在这里插入图片描述

    Tomcat:

    (1)Tomcat中只有一个Server,一个Server可以有多个Service,一个Service可以有多个Connector和一个Container;
    (2) Server掌管着整个Tomcat的生死大权;
    (4)Service 是对外提供服务的;
    (5)Connector用于接受请求并将请求封装成Request和Response来具体处理;
    (6)Container用于封装和管理Servlet,以及具体处理request请求;

    Connector:
    在这里插入图片描述

    四个子容器:

    (1)Engine:引擎,用来管理多个站点,一个Service最多只能有一个Engine;
    (2)Host:代表一个站点,也可以叫虚拟主机,通过配置Host就可以添加站点;
    (3)Context:代表一个应用程序,对应着平时开发的一套程序,或者一个WEB-INF目录以及下面的web.xml文件;
    (4)Wrapper:每一Wrapper封装着一个Servlet;

    上述的包含关系或者说是父子关系,都可以在tomcat的conf目录下的server.xml配置文件中看出,下图是删除了注释内容之后的一个完整的server.xml配置文件(Tomcat版本为8.0)
    在这里插入图片描述

    更多详情

    五、那么Tcp是用来干什么的呢?

    回到上面的场景,主机A想把数据发送给主机B,那谁来保证数据能可靠的到达对方呢?这就是Tcp协议所要做的事情。
    那Http协议又是怎么回事呢?我们上面接收的Ip,Tcp都是跟传输相关的,而Http是跟应用相关的,是跟数据所表达的意义相关的,比如,主机A发一份数据给主机B之后,主机B接收到这份数据后,它要干什么呢?它要执行什么动作呢?这就是Http协议所要表达的,通过在数据中增加一些有意义的元素,比如请求方法,这样数据接收方能更快的根据Http协议解析数据,完成对应的动作。
    解析的比较粗,因为这不是本文的重点,我的重点是,那么谁来实现Http协议,谁来实现Tcp协议呢?
    答案是:操作系统来实现Tcp协议,比如Linux、Windows,运行在操作系统之上的其他应用程序来实现Http协议,比如浏览器、Tomcat。
    比如Linux的源码中就有关于Tcp协议的实现,包括三次握手,四次挥手,都是通过c语言来实现的。那么浏览器它依照Http协议定义好数据之后,怎么利用Tcp协议发送出去呢?Tomcat怎么利用Tcp协议接收数据呢?
    浏览器能不能直接调用操作系统中实现TCP协议关于发送数据的函数呢?Tomcat能不能调用对应接收数据的函数呢?
    原理上是可以的,但是就像我们开发业务一样,我们不会将真正实现业务的方法直接暴露给其他人调用,而会提供一个接口,操作系统也一样,这个接口就是Socket。
    所以Tomcat是通过Socket从操作系统获取数据的,拿到数据后进行解析。
    而Tomcat从操作系统系统拿数据又有几种方式,也就是IO模型:BIO,NIO,AIO,这些不同的模式Tomcat都是支持的,只需要在server.xml中进行配置即可。
    简单记录了一下关于Tomcat的随笔,其实关于TSocket、IO模型可以写得更多一点,限于篇幅,本篇就到此为止吧,下次继续。

    在这里插入图片描述

    展开全文
  • SpringMVC先启动Tomcat等服务器。Tomcat只关心容器里面的servelt,当有请求访问的时候,Tomcat中的tuling-web项目根据app这个路径去找对应的servelt。由第一张图片可以知道app路径映射的servlet是DispatcherServlet...

    SpringMVC先启动Tomcat等服务器。

    Tomcat只关心容器里面的servelt,当有请求访问的时候,Tomcat中的tuling-web项目根据app这个路径去找对应的servelt。由第一张图片可以知道app路径映射的servlet是DispatcherServlet。

    Tomcat容器根据请求路径去构造一个HttpReuqest对象,作为DispatcherServlet的请求参数,

    DispatcherServlet拦截后,先获取Controller注解的bean,然后遍历找到匹配的mapping路径的方法。 很明显DispatcherServlet跟我们的spring容器会有关系。因为拦截器要去找到spring容器中的加了@Controller与@Service的注解的bean。

    DispatcherServlet中的spring容器就是webApplicationContext这个属性。 

    这里之所以要去加载spring.xml就是因为每一个DispathcerServlet要有一个spring容器。 

    1,当启动Tomcat容器,就去会解析程序员写的web.xml文件。

    2,实例化DispatcherServlet对象
     

    3,调用init初始化方法。

    根据contextClass创建想要的容器。 

    getContextConfigLocation()方法就是去获取web.xml的DispatcherServlet中的spring配置文件的路径。

    wac为最终创建完成的spring容器对象。

    listener是创建父容器的入口。

    展开全文
  • tomcat底层原理

    2020-03-03 02:07:49
    1.tomcat 是什么? 好多人说tomcat是一个servlet容器,那么servlet又是什么呢?servlet是server applet的总称,简单理解就是服务端程序,即客户端发送请求-->网络传送--服务端接收处理请求三个环节中的最后一个...

    1.tomcat 是什么?

        好多人说tomcat是一个servlet容器,那么servlet又是什么呢?servlet是server applet的总称,简单理解就是服务端程序,即客户端发送请求-->网络传送--服务端接收处理请求三个环节中的最后一个环节,为了统一客户端的请求即出现了servlet规范。

    2.servlet中的doGet方法调用,需要传入req和resp,谁去实现这个接口呢?答案是tomcat实现了此接口,因为tomcat接受到客户端请求处理之后将参数组装成request和response,然后调用doGet()方法;

    3.jar和war的区别:jar一般认为是依赖包,tomcat无法区分jar包是依赖还是一个web应用,所以一般部署就是war包;

       tomcat部署三种方式:

          1.描述符部署

             context.xml中定义或者再server.xml中定义一个context;

          2.war包和文件夹部署如下源码

    4.tomcat容器之间的关系

         servlet ->wrapper->context(应用)-->host(主机)-->Engine(容器)

      

     servlet 请求顺序:Engine(Plpleline)-->host(Plpleline)-->context(Plpleline)-->wrapper(Plpleline)(StandardWrapperValve)-->servlet(httpservlet)

       如下图示即可体现wrapper-->servlet之间的调用关系

    到此我们如下平面图的右侧部分可以理解清楚了

    那么现在来看左边部分的实现,浏览器到底是怎样给tomcat发送请求的呢?那就得引入TCP协议规范了,TCP协议可以保证数据可靠的传输,操作系统实现了TCP协议,如下linux源码中实现得三次握手

    java中实现socket根据源码得知最终实现了native方法,

    在openJDK中得实现如下

    继续寻找

    window系统中寻找文件

    如下就是操作系统里面给出的接口

    展开全文
  • TOMCAT底层原理

    2020-05-31 17:32:07
    利用学过的Java基础知识模拟一个tomcat请求和响应的流程 B/S 浏览器/服务器 MVC分层架构思想 V:view 浏览器(内容“字符串”);C:controller 控制层;M:模型层 数据模型(数据处理 数据读写 数据存储) 除...
  • Tomcat 底层原理

    2019-06-04 22:17:30
    (1)Tomcat中只有一个Server,一个Server可以有多个Service,一个Service可以有多个Connector和一个Container; (2) Server掌管着整个Tomcat的生死大权; (4)Service 是对外提供服务的; (5)Connector用于...
  • 深入浅出了解Tomcat底层原理开始了解TomcatTomcat的定位Tomcat的结构Tomcat的启动和生命周期配置Tomcat需要了解的Container子容器Tomcat配置总结 开始了解Tomcat 首先要了解Servlet,它是J2EE标准的一部分,是Java ...
  • tomcat底层原理解析

    2019-10-16 22:46:56
    连接器:接受scoket请求,并且转换成ServletRequest容器处理 容器 定位servlet,执行逻辑,并相应ServletRepsonse.
  • tomcat底层原理_浅入

    2020-03-16 10:22:45
    本文将从4个方向讲述tomcat容器 一、tomcat中四大servlet容器 二、tomcat执行请求流程解析 三、tomcat与socket/tcp/http协议关系 四、tomcat io模型解析 Tomcat重要性: web项目都需要tomcat,其作用用于连接用户和...
  • 本文主要讲了从三个方面对Tomcat进行优化: 1.Tomcat的JVM的内存优化 2.Tomcat的JVM的GC策略优化 3.Tomcat的连接器优化 1.JVM调优 Tomcat的实质也是一个Java应用,那么JVM的配置就与其运行性能密切相关。通常,JVM...
  • Tomcat底层原理分析:2.Tomcat架构分析

    千次阅读 2020-06-23 19:59:42
    本文主要讲了Tomcat的各个组件之间的关系以及Tomcat底层是如何实现“一个URL定位到一个具体的servlet”。注:本文图片均来自java进阶教程动手实现Tomcat【黑马程序员精品公开课】,侵权立删。 1.Tomcat整体架构 ...
  • 本文主要对server.xml中主要的配置参数内容进行解析,可以将本文结合Tomcat底层原理分析:2.Tomcat架构分析一起阅读 注:本文主要摘自Tomcat中server.xml文件内各节点详解,侵权立删。 1.server.xml server.xml是...
  • 深入理解 Tomcat(三)Tomcat 底层实现原理

    万次阅读 多人点赞 2017-11-29 00:18:09
    又是一个周末,这篇文章将从一个简单的例子来理解tomcat底层设计;本文将介绍 Java Web 服务器是如何运行的, Web 服务器也称为超文本传输协议( HyperText Transfer Protocol, HTTP)服务器, 因为它使用 Http 与其...
  • 本文主要讲了如何设置Tomcat集群以及如何使用Nginx进行反向代理; 注:本文图片均来自java进阶教程动手实现Tomcat【黑马程序员精品公开课】,侵权立删。 1.Tomcat集群结构图 通过Nginx进行反向代理,即可实现访问一...
  • 部署完Tomcat环境之后,Tomcat会有一些默认功能和默认配置,建议按照下面的提示修改Tomcat的默认配置!!! 安装完Tomcat后,强烈建议情况webapps目录下所有的文件,即禁用Tomcat的管理界面,防止出现别人通过管理...
  • 作者认为随着时间推移,JSP会使用的越来越少,因此这里不会对“Tomcat中与JSP引擎”进行讲解。注:本文图片均来自黑马程序员精品公开课,侵权立删。 1.Jasper简介 【HTML】静态网页资源,浏览器只能加载静态资源。 ...
  • 轻松掌握Tomcat底层原理

    千次阅读 2016-08-01 10:46:26
    程序员在做web开发时都会要用到tomcat的,这里我详细讲解一下tomcat底层原理。 现在使用的最多的tomcat是6.0和7.0的版本的,都可以在apache官网上下载到。6.0的安装需要像普通的软件安装时候一样按下一步下一步的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,592
精华内容 15,836
关键字:

tomcat底层原理

友情链接: shuziyouxi.zip