Tomcat 汤姆猫

作者: 无羡爱诗诗 | 来源:发表于2018-11-17 18:42 被阅读105次
    Tomcat 汤姆猫

                            Tomcat的主人

    第一个问题

    Tomcat是什么?

    Tomcat是应用服务器,区别于硬件(应用服务器和数据服务器等)它是运行在硬件上的软件也叫Web应用服务器。

    百度百科是这样解释的:Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

    Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。

    诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。目前Tomcat最新版本为9.0。

    第二个问题

    Tomcat怎么用?

    首先你就把它当成一个运行在服务器操作系统上的一个应用软件就好了。既然是应用软件那就必然经历下面几个过程:下载---安装---配置环境变量。经过这样3步,你的Tomcat就搭建好了,以后就可以把自己开发的应用程序部署到Tomcat上运行。那么自己开发的应用程序是不能直接部署到操作系统的,而是部署到Tomcat里,Tomcat实际上就是一个个应用程序的管理者,所以叫它应用服务器,这个服务器提供应用服务。

    具体来讲当你在浏览器的网址输入端输入端输入一个URL(统一资源定位)时,经过一个特别 复杂的过程后,浏览器才能将应用服务器返回给它的内容解析成你想要的样子。

    访问某个网址我们经li了什么

    第三个问题

    Tomcat这个应用程序的结构是什么样的?换句话说这位大美女有什么特点啊?鼻子高不高?眼睛大不大?身材好不好?不好意思,在程序员眼里,向TOMCAT这样的应用程序实在是太美了,可以当做范本来学习,提高编程的能力,其中蕴含的思想是非常有深度的。

    先来看看Tomcat的整体结构:

    Tom的身体

    层次分明,是不是很有美感?

    Tomcat中最顶层的容器叫Server,代表整个服务器,Server中包含至少一个Service,用于具体提供服务。Service主要包含两部分:Connector和Container。Connector用于处理连接相关的事情,并提供Socket与request、response的转换,Container用于封装和管理Servlet,以及具体处理request请求。一个Tomcat中只有一个Server,一个Server可以包含多个Service,一个Service只有一个Container,但可以有多个Connectors(因为一个服务可以有多个连接,如同时提供http和https连接,也可以提供相同协议不同端口的连接)。

    这是标准技术性描述,不用理解技术术语的前提下完全可以看懂Tomcat是由什么组成的,每个组件的数量是多少,这些说得都非常清楚。

    说了半天原来这个美女的外国名字叫:Server,你可以翻译成女仆的。这位人民公仆会“分身术”,所以它可以同时提供很多个Service(服务),比如同时给你洗脚、捶背、泡茶、做美食。牛不牛,这个“分身术”的设定就很牛!然后重点来了,每个Service都包括一个Connector和一个Container.翻译过来就是,每一项服务都需要“预约”,然后把给你服务需要的工具箱(Container)拿出来。

    Connector这东西,看起来就是个简单的连接,像极了打电话,你拨号出去输入1234567786等等,移动服务商的设备却经历了一个复杂的过程帮你呼叫那个叫“小丽”的用户。Connector也是一样的,要转变或者翻译给内部的Container。

    Connector: 处理连接相关的事情,并提供Socket与request、response的转换; 因为我们的一个请求通过浏览器发出后是通过Socket、TCP/IP、HTTP等完成的,这些内容自己去看一下《网络编程》,应用层、传输层、网络层、链路层、物理层等等,这个过程还是比较复杂的。

    Container: 封装和管理Servlet(服务器应用),以及具体处理request请求。

    结构图 容器装配结构图

    上面两幅图Container的结构图和Container容器装配结构图。

    Container的子容器Engine、Host、Context、Wrapper是逐层包含的关系,其中Engine是最顶层,每个service最多只能有一个Engine,Engine里面可以有多个Host,每个Host下可以有多个Context,每个Context下可以有多个Wrapper。

    4个容器的作用分别是:

    □Engine:引擎,用来管理多个站点,一个Service最多只能有一个Engine。

    □Host:代表一个站点,也可以叫虚拟主机,通过配置Host就可以添加站点。

    □Context:代表一个应用程序,对应着平时开发的一套程序,或者一个WEB-INF目录以及下面的web.xml文件。

    □Wrapper:每个Wrapper封装着一个Servlet。

    Context和Host的区别是Context表示一个应用,比如,默认配置下webapps下的每个目录都是一个应用,其中ROOT目录中存放着主应用,其他目录存放着别的子应用,而整个webapps是一个站点。假如www.excelib.com域名对应着webapps目录所代表的站点,其中的ROOT目录里的应用就是主应用,访问时直接使用域名就可以,而webapps/test目录存放的是test子应用,访问时需要用www.excelib.com/test,每一个应用对应一个Context,所有webapps下的应用都属于www.excelib.com站点,而blog.excelib.com则是另外一个站点,属于另外一个Host。

    如果你只是想了解一下汤姆猫基本的“美”,科普到这里已经可以了。如果你想更好地体会它的美,那么到官网下载源码来研究一下吧,那里你会发现一个不一样的世界,欧耶!

    Tomcat 汤姆猫

    第四个问题

    细化Connector

    Tomcat 汤姆猫

    Connector中具体是用ProtocolHandler来处理请求的,不同的ProtocolHandler代表不同的连接类型,比如,Http11Protocol使用的是普通Socket来连接的,Http11NioProtocol使用的是NioSocket来连接的。

    ProtocolHandler里面有3个非常重要的组件:Endpoint、Processor和Adapter。Endpoint用于处理底层Socket的网络连接,Processor用于将Endpoint接收到的Socket封装成Request,Adapter用于将封装好的Request交给Container进行具体处理。也就是说Endpoint用来实现TCP/IP协议,Processor用来实现HTTP协议,Adapter将请求适配到Servlet容器进行具体处理。

    Endpoint的抽象实现AbstractEndpoint里面定义的Acceptor和AsyncTimeout两个内部类和一个Handler接口。Acceptor用于监听请求,AsyncTimeout用于检查异步request的超时,Handler用于处理接收到的Socket,在内部调用了Processor进行处理。

    Connector的结构如图7-6所示。

    Tomcat 汤姆猫

    图7-6 Connector结构关系图

    7.5.2 Connector自身类

    Connector类本身的作用主要是在其创建时创建ProtocolHandler,然后在生命周期的相关方法中调用了ProtocolHandler的相关生命周期方法。Connector的使用方法是通过Connector标签配置在conf/server.xml文件中,所以Connector是在Catalina的load方法中根据conf/server.xml配置文件创建Server对象时创建的。Connector的生命周期方法是在Service中调用的。

    Connector的创建

    Connector的创建过程主要是初始化ProtocolHandler。server.xml配置文件中Connector标签的protocol属性会设置到Connector构造函数的参数中,它用于指定ProtocolHandler的类型,Connector的构造函数代码如下:

    spring MVC 核心概念

    Handler:也就是处理器,它直接对应着MVC中的C也就是Controller层,它的具体表现形式有很多,可以是类,也可以是方法,如果你能想到别的表现形式也可以使用,它的类型是Object。我们前面例子中标注了@RequestMapping的所有方法都可以看成一个Handler。只要可以实际处理请求就可以是Handler。

    HandlerMapping:是用来查找Handler的,在Spring MVC中会处理很多请求,每个请求都需要一个Handler来处理,具体接收到一个请求后使用哪个Handler来处理呢?这就是HandlerMapping要做的事情。

    HandlerAdapter:很多人对这个的理解都不准确,其实从名字上就可以看出它是一个Adapter,也就是适配器。因为Spring MVC中的Handler可以是任意的形式,只要能处理请求就OK,但是Servlet需要的处理方法的结构却是固定的,都是以request和response为参数的方法(如doService方法)。怎么让固定的Servlet处理方法调用灵活的Handler来进行处理呢?这就是HandlerAdapter要做的事情。

    通俗点的解释就是Handler是用来干活的工具,HandlerMapping用于根据需要干的活找到相应的工具,HandlerAdapter是使用工具干活的人。比如,Handler就像车床、铣床、电火花之类的设备,HandlerMapping的作用是根据加工的需求选择用什么设备进行加工,而HandlerAdapter是具体操作设备的工人,不同的设备需要不同的工人去加工,车床需要车工,铣床需要铣工,如果让车工使用铣床干活就可能出问题,所以不同的Handler需要不同的HandlerAdapter去使用。我们都知道在干活的时候人是柔性最强、灵活度最高的,同时也是问题最多、困难最多的。Spring MVC中也一样,在九大组件中HandlerAdapter也是最复杂的,所以在后面学习HandlerAdapter的时候要多留心。

    另外View和ViewResolver的原理与Handler和HandlerMapping的原理类似。View是用来展示数据的,而ViewResolver用来查找View。通俗地讲就是干完活后需要写报告,写报告又需要模板(比如,是调查报告还是验收报告或者是下一步工作的请示等),View就是所需要的模板,模板就像公文里边的格式,内容就是Model里边的数据,ViewResolver就是用来选择使用哪个模板的。

    现在再回过头去看上面的四句代码应该就觉得很容易理解了,它们分别是:使用HandlerMapping找到干活的Handler,找到使用Handler的HandlerAdapter,让HandlerAdapter使用Handler干活,干完活后将结果写个报告交上去(通过View展示给用户)。

    相关文章

      网友评论

        本文标题:Tomcat 汤姆猫

        本文链接:https://www.haomeiwen.com/subject/qsdifqtx.html