分析Tomcat的工作原理_Tomcat

来源:脚本之家  责任编辑:小易  

JSP运行环境:执行2113JSP代码需要在服务器上安装JSP引擎,比较5261常见的引擎有WebLogic和Tomcat。把这些支持4102JSP的web服务器配置好后。就1653可以再客户端通过浏览器来访问JSP页面了。默认端口一般是7001.JSP生命周期:JSP处理请求的方法就是把这些请求都统一看做Servlet。由于这个原因,JSP的很多功能和生命周期,都由Java Servlet技术标准定义的。这种限制,在动态内容方面更加明显。所以学习JSP的时候,需要温习Servlet的内容和标准。JSP网络应用服务器框架:在符合J2EE规范的服务器构建起来之后,就可以编写JSP页面了,在HTML页面中嵌入JSP脚本,该页面就成为JSP页面了。JSP脚本用特定的标记括起来,如<%...%>,或者<JSP>…</JSP>。JSP的工作流程如下:当其读到HTML的代码的时候,就直接输出到客户端,而如果读到嵌入JSP脚本的时候,就需要对这些脚本进行另外的翻译和处理,得到输出之后再输出到客户端。下面通过一个简单页面编写来了解JSP网络应用的框架:1.JSP客户端交互JSP的大部分工作就是与客户端进行交互。客户端一般指的是浏览器,它们与置于服务器端得JSP页面进行交互。JSP脚本中所有的Java语句都是在服务器执行,服务器接受客户端提交的请求,通过一定的处理之后,将结果返回给客户端,客户端得到的仅仅是HTML代码。下面是一个JSP的HelloWorld程序代码:<html> <head> <title>HelloWorld for JSP</title> </head> <body> <h1>HelloWord for JSP</h1> <%out.println("<h3>Hello World!</h3>");%> </body> </html> 2.交互过程的流程在一般的客户端和服务器端的交互中,是用HTTP协议,客户端通过下面4个步骤也服务器段进行交互:(1)客户端和服务器端建立连接(2)发送客户端请求(3)服务器返回应答给客户(4)客户端关闭连接所有的请求都是由客户端主动发出的,而服务器一直出于被动的监听状态。用户在浏览器键入要访问的地址,按回车键确认后,浏览器开始与服务器建立连接,从这时开始,就开始了一次交互过程。浏览器通过一段时间的等待后,从服务器得到响应,并且把相应的信息以HTML方式呈现给用户。用户在浏览网站的过程中,实际上包含了很多这样的交互应答过程。在客户端与JSP页面的交互过程中,只有服务器接收请求和返回应答的动作可能不一样,其他与上面过程基本一致。基本情况如下:(1)服务器在收到一个请求后首先要分析这个请求,如果请求的页面只是一般的HTML页面,服务器就直接读出HTML页面并返回给客户端(2)如果客户端请求的是JSP页面,服务器调用JSP引擎翻译处理所请求的JSP页面,并将翻译和处理之后的HTML返回给客户端(3)如果遇到JavaBeans组件,JSP引擎将调用相应的JavaBeans组件,得到JavaBeans的返回值,最后返回给JSP页面3.JSP引擎的工作原理当一个JSP页面第一次被访问的时候,JSP引擎将执行以下步骤:(1)将JSP页面翻译成一个Servlet,这个Servlet是一个java文件,同时也是一个完整的java程序(2)JSP引擎调用java编译器对这个Servlet进行编译,得到可执行文件class(3)JSP引擎调用java虚拟机来解释执行class文件,生成向客户端发送的应答,然后发送给客户端以上三个步骤仅仅在JSP页面第一次被访问时才会执行,以后的访问速度会因为class文件已经生成而大大提高。当JSP引擎街道一个客户端的访问请求时,首先判断请求的JSP页面是否比对应的Servlet新,如果新,对应的JSP需要重新编译。4.对请求信息的处理在大部分的交互过程中,一个JSP页面首先对用户提出的请求进行分析,然后从请求中得到有用的数据,比如接收用户提交的数据或者请求的方法,然后进行相应的处理。而这就需要了解得到传入参数的方法和得到用户其他信息的方法。(1)得到传入参数的方法在交互过程中,服务器必须从客户端得到一些数据,来帮助处理过程的进行。这些数据包括用户身份验证数据(如用户名、密码等)以及其他中要信息。而这些数据的载体,就是用户提交的请求。请求的组成主要有两部分,一是头信息。头信息包含了以下信息:请求的方法(GET和POST)、请求的URL和浏览器信息。其他信息包含了一些数据信息。首先要了解的是GET方法发送请求时,这种方法是客户端用来向服务器段请求信息的,所以在请求中不包含信息体。用户只能把请求的内容作为参数附加在URL后面进行发送,参数之间用“&”符号隔开,如代码:一个典型的GET请求的表单get.html<html> <head> <title>Get</title> </head> <body> <h1>Get Method</h1> <form action = "submit.jsp" method = "GET"> username<input name = "uername" value = "aaa"><br> password<inpput type = password name = "password" value = "111111"><br> <input type = submit value = "submit"> </form> </body> </html> (代码中有一个表单,表单在定义的时候,定义了属性method=“GET”,这表明表单提交的方法是GET。这个表单向服务器提交两个参数,其中一个是username,缺省值为aaa,另外一个是password,其缺省值是111111。)这个页面只是得到了输入数据,只有submit.JSP才能实现提交这个页面的数据。这就是需要用到JSP了,代码如下:submit.JSP<html> <head> <title>submit</title> </head> <body> <h1>submit</h1> request method:<%=request.getMethod() %><br> user name:<%=request.getParameter("user") %><br> password:<%=request.getParameter("password") %><br> </body> </html> 在这个JSP页面中是用了JSP的内置对象request的两个方法,一个是getMethod,用来获取当前请求的类型,另一个是getParameter,用来获取指定参数的值。在get.html中单击submit按钮,就可以显示表单请求方法,用户名以及密码等信息。(2)得到其他信息的方法得到非用户输入的其他参数信息,就需要用到其他的方法。如下所示是一个得到客户端信息的简单程序。根据这个程序我们可以初步了解如何得到客户端信息的大致思路。代码如下:<html> <head> <title>得到消息</title> </head> <body> <h1>请求中所包含的URL</h1><br> <%=request.getQueryString()%><br> </body> </html>www.zgxue.com防采集请勿采集本网。

SpringBoot 就像一条巨蟒,慢慢缠绕着我们,使我们麻痹。不得不承认,使用了 SpringBoot 确实提高了工作效率,但同时也让我们遗忘了很多技能。刚入社会的时候,我还是通过 Tomcat 手动部署 JavaWeb 项目,还经常对 Tomcat 进行性能调优。除此之外,还需要自己理清楚各 Jar 之间的关系,以避免 Jar 丢失和各版本冲突导致服务启动异常的问题。到如今,这些繁琐而又重复的工作已经统统交给 SpringBoot 处理,我们可以把更多的精力放在业务逻辑上。但是,清楚 Tomcat 的工作原理和处理请求流程和分析 Spring 框架源码一样的重要。至少面试官特别喜欢问这些底层原理和设计思路。希望这篇文章能给你一些帮助。

servlet 请求 响应 死掉 tomcat 启动服务器 http 一种协议

Tomcat 整体架构

在你要看代码的地方,ctrl+方法名(或者类名),会弹出一个页面,在这个页面上,你关联一下你下载的Tomcat源码包。 关闭之后,在ctrl+方法名(或者类名)就

Tomcat 是一个免费的、开源的、轻量级的 Web 应用服务器。适合在并发量不是很高的中小企业项目中使用。

Tomcat是Apache 软件基金会的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet

文件目录结构

Tomcat通俗说就是一个web容器,商家将他的应用程序部署在Tomcat上,你通过浏览器也就是客户端进行访问时,Tomcat进行解析处理你的请求,然后将信息在返回你,

以下是 Tomcat 8 主要目录结构

er element represents the entire Catalina servlet container. (Singleton) 1.2 - Service A Service element represents the combination of one or

目录 功能说明
bin 存放可执行的文件,如 startup 和 shutdown
conf 存放配置文件,如核心配置文件 server.xml 和应用默认的部署描述文件 web.xml
lib 存放 Tomcat 运行需要的jar包
logs 存放运行的日志文件
webapps 存放默认的 web 应用部署目录
work 存放 web 应用代码生成和编译文件的临时目录

功能组件结构

Tomcat 的核心功能有两个,分别是负责接收和反馈外部请求的连接器 Connector,和负责处理请求的容器 Container。其中连接器和容器相辅相成,一起构成了基本的 web 服务 Service。每个 Tomcat 服务器可以管理多个 Service。

组件 功能
Connector 负责对外接收反馈请求。它是 Tomcat 与外界的交通枢纽,监听端口接收外界请求,并将请求处理后传递给容器做业务处理,最后将容器处理后的结果反馈给外界。
Container 负责对内处理业务逻辑。其内部由Engine、Host、Context 和 Wrapper 四个容器组成,用于管理和调用 Servlet 相关逻辑。
Service 对外提供的 Web 服务。主要包含连接器和容器两个核心组件,以及其他功能组件。Tomcat 可以管理多个 Service,且各 Service 之间相互独立。

Tomcat 连接器核心原理

Tomcat 连接器框架——Coyote

连接器核心功能

一、监听网络端口,接收和响应网络请求。

二、网络字节流处理。将收到的网络字节流转换成 Tomcat Request 再转成标准的 ServletRequest 给容器,同时将容器传来的 ServletResponse 转成 Tomcat Response 再转成网络字节流。

连接器模块设计

为满足连接器的两个核心功能,我们需要一个通讯端点来监听端口;需要一个处理器来处理网络字节流;最后还需要一个适配器将处理后的结果转成容器需要的结构。

组件 功能
Endpoint 端点,用来处理 Socket 接收和发送的逻辑。其内部由 Acceptor 监听请求、Handler 处理数据、AsyncTimeout 检查请求超时。具体的实现有 NioEndPoint、AprEndpoint 等。
Processor 处理器,负责构建 Tomcat Request 和 Response 对象。具体的实现有 Http11Processor、StreamProcessor 等。
Adapter 适配器,实现 Tomcat Request、Response 与 ServletRequest、ServletResponse之间的相互转换。这采用的是经典的适配器设计模式。
ProtocolHandler 协议处理器,将不同的协议和通讯方式组合封装成对应的协议处理器,如 Http11NioProtocol 封装的是 HTTP + NIO。

对应的源码包路径 org.apache.coyote 。对应的结构图如下

Tomcat 容器核心原理

Tomcat 容器框架——Catalina

容器结构分析

每个 Service 会包含一个容器。容器由一个引擎可以管理多个虚拟主机。每个虚拟主机可以管理多个 Web 应用。每个 Web 应用会有多个 Servlet 包装器。Engine、Host、Context 和 Wrapper,四个容器之间属于父子关系。

容器 功能
Engine 引擎,管理多个虚拟主机。
Host 虚拟主机,负责 Web 应用的部署。
Context Web 应用,包含多个 Servlet 封装器。
Wrapper 封装器,容器的最底层。对 Servlet 进行封装,负责实例的创建、执行和销毁功能。

对应的源码包路径 org.apache.coyote 。对应的结构图如下

容器请求处理

容器的请求处理过程就是在 Engine、Host、Context 和 Wrapper 这四个容器之间层层调用,最后在 Servlet 中执行对应的业务逻辑。各容器都会有一个通道 Pipeline,每个通道上都会有一个 Basic Valve(如StandardEngineValve), 类似一个闸门用来处理 Request 和 Response 。其流程图如下。

Tomcat 请求处理流程

上面的知识点已经零零碎碎地介绍了一个 Tomcat 是如何处理一个请求。简单理解就是连接器的处理流程 + 容器的处理流程 = Tomcat 处理流程。哈!那么问题来了,Tomcat 是如何通过请求路径找到对应的虚拟站点?是如何找到对应的 Servlet 呢?

映射器功能介绍

这里需要引入一个上面没有介绍的组件 Mapper。顾名思义,其作用是提供请求路径的路由映射。根据请求URL地址匹配是由哪个容器来处理。其中每个容器都会它自己对应的Mapper,如 MappedHost。不知道大家有没有回忆起被 Mapper class not found 支配的恐惧。在以前,每写一个完整的功能,都需要在 web.xml 配置映射规则,当文件越来越庞大的时候,各个问题随着也会出现

HTTP请求流程

打开 tomcat/conf 目录下的 server.xml 文件来分析一个http://localhost:8080/docs/api 请求。

第一步:连接器监听的端口是8080。由于请求的端口和监听的端口一致,连接器接受了该请求。

第二步:因为引擎的默认虚拟主机是 localhost,并且虚拟主机的目录是webapps。所以请求找到了 tomcat/webapps 目录。

第三步:解析的 docs 是 web 程序的应用名,也就是 context。此时请求继续从 webapps 目录下找 docs 目录。有的时候我们也会把应用名省略。

第四步:解析的 api 是具体的业务逻辑地址。此时需要从 docs/WEB-INF/web.xml 中找映射关系,最后调用具体的函数。

<?xml version="1.0" encoding="UTF-8"?><Server port="8005" shutdown="SHUTDOWN"> <Service name="Catalina"><!-- 连接器监听端口是 8080,默认通讯协议是 HTTP/1.1 --> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <!-- 名字为 Catalina 的引擎,其默认的虚拟主机是 localhost --> <Engine name="Catalina" defaultHost="localhost"> <!-- 名字为 localhost 的虚拟主机,其目录是 webapps--> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> </Host> </Engine> </Service></Server>

SpringBoot 如何启动内嵌的 Tomcat

SpringBoot 一键启动服务的功能,让有很多刚入社会的朋友都忘记 Tomcat 是啥。随着硬件的性能越来越高,普通中小项目都可以直接用内置 Tomcat 启动。但是有些大一点的项目可能会用到 Tomcat 集群和调优,内置的 Tomcat 就不一定能满足需求了。

我们先从源码中分析 SpringBoot 是如何启动 Tomcat,以下是 SpringBoot 2.x 的代码。

代码从 main 方法开始,执行 run 方法启动项目。

SpringApplication.run

从 run 方法点进去,找到刷新应用上下文的方法。

this.prepareContext(context, environment, listeners, applicationArguments, printedBanner);this.refreshContext(context);this.afterRefresh(context, applicationArguments);

从 refreshContext 方法点进去,找 refresh 方法。并一层层往上找其父类的方法。

this.refresh(context);

在 AbstractApplicationContext 类的 refresh 方法中,有一行调用子容器刷新的逻辑。

this.postProcessBeanFactory(beanFactory);this.invokeBeanFactoryPostProcessors(beanFactory);this.registerBeanPostProcessors(beanFactory);this.initMessageSource();this.initApplicationEventMulticaster();this.onRefresh();this.registerListeners();this.finishBeanFactoryInitialization(beanFactory);this.finishRefresh();

从 onRefresh 方法点进去,找到 ServletWebServerApplicationContext 的实现方法。在这里终于看到了希望。

protected void onRefresh() { super.onRefresh(); try { this.createWebServer(); } catch (Throwable var2) { throw new ApplicationContextException("Unable to start web server", var2); }}

从 createWebServer 方法点进去,找到从工厂类中获取 WebServer的代码。

if (webServer == null && servletContext == null) { ServletWebServerFactory factory = this.getWebServerFactory(); // 获取 web server this.webServer = factory.getWebServer(new ServletContextInitializer[]{this.getSelfInitializer()});} else if (servletContext != null) { try { // 启动 web server this.getSelfInitializer().onStartup(servletContext); } catch (ServletException var4) { throw new ApplicationContextException("Cannot initialize servlet context", var4); }}

从 getWebServer 方法点进去,找到 TomcatServletWebServerFactory 的实现方法,与之对应的还有 Jetty 和 Undertow。这里配置了基本的连接器、引擎、虚拟站点等配置。

public WebServer getWebServer(ServletContextInitializer... initializers) { Tomcat tomcat = new Tomcat(); File baseDir = this.baseDirectory != null ? this.baseDirectory : this.createTempDir("tomcat"); tomcat.setBaseDir(baseDir.getAbsolutePath()); Connector connector = new Connector(this.protocol); tomcat.getService().addConnector(connector); this.customizeConnector(connector); tomcat.setConnector(connector); tomcat.getHost().setAutoDeploy(false); this.configureEngine(tomcat.getEngine()); Iterator var5 = this.additionalTomcatConnectors.iterator(); while(var5.hasNext()) { Connector additionalConnector = (Connector)var5.next(); tomcat.getService().addConnector(additionalConnector); } this.prepareContext(tomcat.getHost(), initializers); return this.getTomcatWebServer(tomcat);}

服务启动后会打印日志

o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8900 (http)

o.apache.catalina.core.StandardService : Starting service [Tomcat]

org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.34

o.a.catalina.core.AprLifecycleListener : The APR based Apache Tomcat Native library which allows optimal ...

o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext

o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 16858 ms

END

文章到这里就结束了,实在是 hold 不住了,周末写了一整天还没有写到源码部分,只能放在下一章了。再写真的就要废了,有什么不对的地方请多多指出

以上就是Tomcat的工作原理是怎样的的详细内容,更多关于Tomcat 工作原理的资料请关注真格学网其它相关文章! 您可能感兴趣的文章:tomcat中Servlet的工作机制详细介绍Tomcat解析XML和反射创建对象原理tomcat设置gzip压缩的原理及配置方法Tomcat中的startup.bat原理详细解析Tomcat中的catalina.bat原理详细解析基于Tomcat 数据源的原理、配置、使用介绍Tomcat 热部署的实现原理详解

当浏览器访问2113一个由tomcat搭建的web应用程序时,tomcat会把5261相应的文件,转换成浏览4102器能够显示的文件。1653 浏览器访问的是一个jsp文件时,tomcat会把jsp文件编译成一个servlet,servlet再给浏览器发送相应的数据。只有第一次访问的时候才会编译成servlet以后访问就直接调用对应的servlet。 当浏览器访问的是servlet和html时,tomcat就会直接传递给浏览器,可以看成是一个一个的容器。tomcat运行大致是这样,百度一下内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • tomcat整体结构简单介绍
  • tomcat相关配置与eclipse集成_动力节点java学院整理
  • centos7安装tomcat7的教程图解
  • 如何在mac的terminal安装apache tomcat
  • tomcat nginx redis实现session共享过程图解
  • eclipse添加新server时无法选择tomcat7的解决方法
  • tomcat antiresourcelocking antijarlocking 的作用和用法
  • web安全—tomcat禁用webdav或者禁止不需要的 http 方法
  • 对一个tomcat实现多端口、多域名访问的方法
  • tomcat中的session与cookie深入讲解
  • tomcat运行的原理
  • Tomcat中JSP引擎工作原理?
  • tomcat的运行机制是怎样的
  • tomcat连接池是什么样的工作原理,如何配置
  • servlet,tomcat和http三者的工作原理是怎么样的?
  • 怎么运行深入剖析tomcat中的源码
  • Tomcat的功能是什么
  • tomcat是干什么的?
  • tomcat底层是怎么实现的?
  • Tomcat部署JAVA项目的原理问题,我做了如下测试:
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全星外虚拟主机华众虚拟主机linuxwin服务器ftp服务器dns服务器tomcat nginxzabbix云和虚拟化服务器其它首页服务器tomcat中servlet的工作机制详细介绍tomcat解析xml和反射创建对象原理tomcat设置gzip压缩的原理及配置方法tomcat中的startup.bat原理详细解析tomcat中的catalina.bat原理详细解析基于tomcat 数据源的原理、配置、使用介绍tomcat 热部署的实现原理详解tomcat整体结构简单介绍tomcat相关配置与eclipse集成_动力节点java学院整理centos7安装tomcat7的教程图解如何在mac的terminal安装apache tomcattomcat nginx redis实现session共享过程图解eclipse添加新server时无法选择tomcat7的解决方法tomcat antiresourcelocking antijarlocking 的作用和用法web安全—tomcat禁用webdav或者禁止不需要的 http 方法对一个tomcat实现多端口、多域名访问的方法tomcat中的session与cookie深入讲解tomcat7.0安装配置详细(图文)直接双击启动tomcat中的startup.tomcat中更改网站根目录和默认页在tomcat中部署web项目的操作方法关于tomcat的server.xml里host节如何修改tomcat默认端口号8080的tomcat环境变量详细配置步骤windows下配置两个或多个tomcat启window7下tomcat7.0安装配置方法启动tomcat时 错误: 代理抛出异常tomcat配置ssl证书的方法简单记录cent os服务器配置jdk+tomcat+mylinux下重启多个 tomcat 服务的脚本(推荐修改tomcat默认访问根目录的方法tocat 下的日志配置参考代码解决应用启动失败但tomcat不报错的方法关于tomcat的server.xml里host节点配置的window下安装tomcat服务器的教程tomcat中对静态资源的处理教程在同一台服务器上配置多个tomcat的方法
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved