Http工作原理
Http协议是 浏览器和服务器之间的数据传送协议、应用层协议;不涉及数据包传输、规定客户端和服务器之间的通信格式
Tomcat整体架构
@Http服务器请求处理
浏览器给服务端一个Http格式的请求
Http服务器收到后需要调用程序处理(Java类),一般不同请求需要不同程序处理
上图中左右两图对比,
1) HTTP服务器直接调用具体业务类=>紧耦合
2) HTTP服务器把请求交给容器处理,容器通过servlet接口调用业务类 => HTTP服务器与业务解耦
@Servlet容器工作流程
客户请求某个资源
HTTP服务器用一个ServletRequest对象把客户的请求封装 -> 发送给Servlet容器
Servlet容器收到请求 -> 根据请求的URL和Servlet的映射关系,找到相应的Servlet -> 调用Servlet的service方法处理请求
Servlet容器把ServletResponse对象返回给HTTP服务器
HTTP服务器把响应发送给客户端
@Tomcat整体架构
Tomcat的两个核心功能
1 )处理socket连接,负责网络字节流与Request和Response对象的转化 => 连接器(Connector),负责对外交流
2 加载和管理Servlet,处理Request请求 => 容器(Container),负责内部处理
Coyote
Coyote是Tomcat连接器的框架名称
Coyote封装了底层的网络通信(Socket请求及响应处理),为Catalina容器提供了统一的接口
Coyote将Socket输入转换封装为Request对象
Catalina将Request进一步封装为ServletRequest
注:在这里可以把Catalina狭义地理解为容器(Service中的Container)
@连接器组件
ProtocolHandler:Coyote协议接口(Endpoint+Processor)
Endpoint:Coyote通信端点(通信监听的接口、具体Socket接收和发送的处理器)=> 用来实现TCP/IP协议、是对传输层的抽象
Processor:Coyote协议处理接口 => 用来实现HTTP协议、是对应用层协议的抽象
Processor接收来自EndPoint的Socket,将字节流解析成Tomcat Request和Response对象,并通过Adapter将其提交到容器处理
@两种连接器
Tomcat在server.xml中配置了两种连接器
1)HTTP Connector监听8080端口,负责建立HTTP连接。通过浏览器访问Tomcat服务器的Web应用时使用。
2)AJP Connector监听8009端口,负责和其它的HTTP服务器建立连接。在把Tomcat与其它HTTP服务器集成时使用。
说明:
Tomcat最主要的功能是提供Servlet/JSP容器;Tomcat对静态资源(如HTML文件或图像文件)的处理速度,以及提供的Web服务器管理功能不如其它专业的HTTP服务器(如IIS和Apache)=>
在实际应用中,常常把Tomcat的与其他HTTP服务器集成,对于不支持的Servlet/JSP的HTTP服务器,可以通过的Tomcat服务器来运行的Servlet/JSP组件。
Catalina
Catalina是Servlet容器实现,它通过松耦合的方式集成Coyote,同时它还包括启动入口、shell程序等
Catalina是Tomcat核心,Tomcat启动的时候会初始化一个Catalina的实例
@Tomcat模块分层结构
@Catalina结构
Catalina | 负责解析Tomcat配置文件->创建Server组件,管理Server |
Server | 表示整个服务器(Catalina Servlet及其它组件),负责组装并启动Servlet引擎、Tomcat连接器,通过实现LifeCycle接口提供启动和关闭整个系统的方式 Server下面有多个服务Service |
Service | Server内部组件,每个Service将若干个连接器组件Connector(Coyote实现)绑定到一个容器组件Container(Engine)上 |
Connector | 连接器处理与客户端的通信,负责接收客户请求,然后转给相关的容器处理,最后返回响应结果给客户 |
Container | 容器负责处理用户的servlet请求 |
@Container结构
Engine | 表示整个Catalina的Servlet引擎,用来管理多个虚拟主机,一个Service最多只有一个Engine,一个Engine可包含多个Host |
Host | 表示一个虚拟主机,一个虚拟主机可包含多个Context |
Context | 表示一个Web应用程序,一个Web应用可包含多个Wrapper |
Wrapper | 表示一个Servlet,Wrapper作为容器中的最底层,不能包含子容器 |
Jasper
@静态页面和动态页面
静态页面的网页代码都在页面中,不能自主管理发布更新的页面。
常见的静态页面扩展名:.html、.htm
动态页面是通过执行asp,php,jsp,.net等程序生成客户端网页代码的网页。可以通过网站后台管理系统对网站的内容进行更新。
常见的静态页面扩展名:.asp .php .jsp .cgi
注意:静态页面和动态页面的区别是网站与客户端有无互动,而不是有无动画
@Jasper
对基于JSP的Web应用,可以直接在JSP页面编写Java代码
可以把jsp看作是一种运行在服务端的脚本,最终输出到客户端的都是标准的HTML页面,并不包含任何Java代码
Jasper模块是Tomcat的JSP核心引擎
JSP本质是一个Servlet
@服务器如何将JSP页面转换为HTML页面?
Tomcat使用Jasper对JSP语法进行解析,生成Servlet并生成Class字节码,用户访问jsp时会访问Servlet,最终访问的结果直接响应在浏览器
在运行的时候Jasper会检测JSP文件是否修改,如果修改,则会重新编译JSP文件
参考资料:
java进阶教程Tomcat核心原理解析 https://www.bilibili.com/video/BV1dJ411N7Um
Tomcat(一):简介 https://blog.csdn.net/u014231646/article/details/79482195
Tomcat HTTP协议与AJP协议 https://blog.csdn.net/jeikerxiao/article/details/82745516
Apache与Tomcat有什么关系和区别 https://www.cnblogs.com/zangdalei/p/8057325.html
Tomcat外传 https://zhuanlan.zhihu.com/p/54121733
浅谈JSP https://zhuanlan.zhihu.com/p/42343690