JSP引擎
JSP 生命周期
编译阶段:servlet 容器编译 servlet 源文 件,生成 servlet 类
初始化阶段:加载与 JSP 对应的 servlet 类, 创建其实例,并调用它的初始化方法
执行阶段:调用与 JSP 对应的 servlet 实例的 服务方法
销毁阶段:调用与 JSP 对应的 servlet 实例的 销毁方法,然后销毁 servlet 实例
JSP元素 代码片段: <% 代码片段 %> JSP声明: <%! declaration; [ declaration; ]+ ... %> JSP表达式:<%= 表达式 %> JSP注释: <%-- 注释 --%> JSP指令: <%@ directive attribute=“value” %> JSP行为: 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 解析过程 **
代码片段:在_jspService()方法内直接输出
JSP 声明: 在 servlet 类中进行输出
JSP 表达式:在_jspService()方法内直接输出
JSP 注释:直接忽略,不输出
JSP 指令:根据不同指令进行区分,include:对引入的文件进行解析;page 相关的属性会做为 JSP 的属性,影响的是解析和请求处理时的行为
JSP 行为:不同的行为有不同的处理方式,jsp:useBean 为例,会从 pageContext 根据 scope 的 类别获取 bean 对象,如果没有会创建 bean,同时存到相应 scope 的 pageContext 中
HTML:在_jspService()方法内直接输出
JSP 隐式对象:在_jspService()方法会进行声明,只能在方法中使用;
Connector
Http:HTTP 是超文本传输协议,是客户端浏览器或其他程序与 Web 服务器之间的应用层通信协 议 AJP:Apache JServ 协议(AJP)是一种二进制协议,专门代理从 Web 服务器到位于后端的应用 程序服务器的入站请求 阻塞 IO
非阻塞 IO
** IO多路复用**
阻塞与非阻塞的区别在于进行读操作和写操作的系统调用时,如果此时内核态没有数据可读或者没有缓冲空间可写时,是否阻塞。
IO多路复用的好处在于可同时监听多个socket的可读和可写事件,这样就能使得应用可以同时监听多个socket,释放了应用线程资源。
Tomcat各类Connector对比
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处理相关类
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主要参数