zl程序教程

您现在的位置是:首页 >  Java

当前栏目

Tomcat组成与工作原理,这一篇,很细 中

2023-03-14 22:54:59 时间

JSP引擎

image

JSP 生命周期

编译阶段:servlet 容器编译 servlet 源文 件,生成 servlet 类

初始化阶段:加载与 JSP 对应的 servlet 类, 创建其实例,并调用它的初始化方法

执行阶段:调用与 JSP 对应的 servlet 实例的 服务方法

销毁阶段:调用与 JSP 对应的 servlet 实例的 销毁方法,然后销毁 servlet 实例

JSP元素 代码片段: <% 代码片段 %> JSP声明: <%! declaration; [ declaration; ]+ ... %> JSP表达式:<%= 表达式 %> JSP注释: <%-- 注释 --%> JSP指令: <%@ directive attribute=“value” %> JSP行为: <jsp:action_name attribute=“value” /> HTML元素: html/head/body/div/p/… JSP隐式对象:request、response、out、session、application、config、 pageContext、page、Exception

**JSP 元素说明 ** 代码片段:包含任意量的 Java 语句、变量、方法或表达式; JSP 声明:一个声明语句可以声明一个或多个变量、方法,供后面的 Java 代码使用; JSP 表达式:输出 Java 表达式的值,String 形式; JSP 注释:为代码作注释以及将某段代码注释掉 JSP 指令:用来设置与整个 JSP 页面相关的属性, <%@ page ... %>定义页面的依赖属性,比如 language、contentType、errorPage、 isErrorPage、import、isThreadSafe、session 等等 <%@ include ... %>包含其他的 JSP 文件、HTML 文件或文本文件,是该 JSP 文件的一部分,会 被同时编译执行 <%@ taglib ... %>引入标签库的定义,可以是自定义标签 JSP 行为:jsp:include、jsp:useBean、jsp:setProperty、jsp:getProperty、jsp:forward

**Jsp 解析过程 **

image

代码片段:在_jspService()方法内直接输出

JSP 声明: 在 servlet 类中进行输出

JSP 表达式:在_jspService()方法内直接输出

JSP 注释:直接忽略,不输出

JSP 指令:根据不同指令进行区分,include:对引入的文件进行解析;page 相关的属性会做为 JSP 的属性,影响的是解析和请求处理时的行为

JSP 行为:不同的行为有不同的处理方式,jsp:useBean 为例,会从 pageContext 根据 scope 的 类别获取 bean 对象,如果没有会创建 bean,同时存到相应 scope 的 pageContext 中

HTML:在_jspService()方法内直接输出

JSP 隐式对象:在_jspService()方法会进行声明,只能在方法中使用;

Connector

image

Http:HTTP 是超文本传输协议,是客户端浏览器或其他程序与 Web 服务器之间的应用层通信协 议 AJP:Apache JServ 协议(AJP)是一种二进制协议,专门代理从 Web 服务器到位于后端的应用 程序服务器的入站请求 阻塞 IO

image

非阻塞 IO

image

** IO多路复用**

image

阻塞与非阻塞的区别在于进行读操作和写操作的系统调用时,如果此时内核态没有数据可读或者没有缓冲空间可写时,是否阻塞。

IO多路复用的好处在于可同时监听多个socket的可读和可写事件,这样就能使得应用可以同时监听多个socket,释放了应用线程资源。

Tomcat各类Connector对比

image

Connector的实现模式有三种,分别是BIO、NIO、APR,可以在server.xml中指定。

JIO:用java.io编写的TCP模块,阻塞IO

NIO:用java.nio编写的TCP模块,非阻塞IO,(IO多路复用)

APR:全称Apache Portable Runtime,使用JNI的方式来进行读取文件以及进行网络传输

Apache Portable Runtime是一个高度可移植的库,它是Apache HTTP Server 2.x的核心。 APR具有许多用途,包括访问高级IO功能(如sendfile,epoll和OpenSSL),操作系统级功能(随机数生成,系统状态等)和本地进程处理(共享内存,NT管道和Unix套接字)。

表格中字段含义说明:

Support Polling:是否支持基于IO多路复用的socket事件轮询

Polling Size:轮询的最大连接数

Wait for next Request:在等待下一个请求时,处理线程是否释放,BIO是没有释放的,所以在keep-alive=true的情况下处理的并发连接数有限

Read Request Headers:由于request header数据较少,可以由容器提前解析完毕,不需要阻塞

Read Request Body:读取request body的数据是应用业务逻辑的事情,同时Servlet的限制,是需要阻塞读取的

Write Response:跟读取request body的逻辑类似,同样需要阻塞写

NIO处理相关类

image

Acceptor线程负责接收连接,调用accept方法阻塞接收建立的连接,并对socket进行封装成PollerEvent,指定注册的事件为op_read,并放入到EventQueue队列中,PollerEvent的run方法逻辑的是将Selector注册到socket的指定事件;

Poller线程从EventQueue获取PollerEvent,并执行PollerEvent的run方法,调用Selector的select方法,如果有可读的Socket则创建Http11NioProcessor,放入到线程池中执行;

CoyoteAdapter是Connector到Container的适配器,Http11NioProcessor调用其提供的service方法,内部创建Request和Response对象,并调用最顶层容器的Pipeline中的第一个Valve的invoke方法

Mapper主要处理http url 到servlet的映射规则的解析,对外提供map方法

NIO Connector主要参数

image