Tomcat 组成与工作原理,java面试题及答案整理

List<Future> results = new ArrayList<Future>();

for (int i = 0; i < children.length; i++) {

results.add(startStopExecutor.submit(new StartChild(children[i])));

}

boolean fail = false;

for (Future result :results) {

try {

result.get();

} catch (Exception e) {

log.error(sm.getString(“containerBase.threadedStartFailed”), e);

fail = true;

}

}

Web 应用的部署方式

注:

  • catalina.home:安装目录

  • catalina.base:工作目录

  • 默认值:user.dir

  • Server.xml 配置 Host 元素,指定 appBase 属性,默认 $catalina.base/webapps/

  • Server.xml 配置 Context 元素,指定 docBase,元素,指定 Web 应用的路径

  • 自定义配置在 $catalina.base/EngineName/HostName/XXX.xml 配置 Context 元素

HostConfig 监听了 StandardHost 容器的事件,在 start 方法中解析上述配置文件:

  • 扫描 appbase 路径下的所有文件夹和 war 包,解析各个应用的 META-INF/context.xml,并创建 StandardContext,并将 Context 加入到 Host 的子容器中。

  • 解析 $catalina.base/EngineName/HostName/ 下的所有 Context 配置,找到相应 Web 应用的位置,解析各个应用的 META-INF/context.xml,并创建 StandardContext,并将 Context 加入到 Host 的子容器中。

注:

  • HostConfig 并没有实际解析 Context.xml,而是在 ContextConfig 中进行的。

  • HostConfig 中会定期检查 watched 资源文件(context.xml 配置文件)

ContextConfig 解析 context.xml 顺序:

  • 先解析全局的配置 config/context.xml

  • 然后解析 Host 的默认配置 EngineName/HostName/context.xml.default

  • 最后解析应用的 META-INF/context.xml

ContextConfig 解析 web.xml 顺序:

  • 先解析全局的配置 config/web.xml

  • 然后解析 Host 的默认配置 EngineName/HostName/web.xml.default 接着解析应用的 MEB-INF/web.xml

  • 扫描应用 WEB-INF/lib/ 下的 jar 文件,解析其中的 META-INF/web-fragment.xml 最后合并 xml 封装成 WebXml,并设置 Context

注:

  • 扫描 Web 应用和 jar 中的注解(Filter、Listener、Servlet)就是上述步骤中进行的。

  • 容器的定期执行:backgroundProcess,由 ContainerBase 来实现的,并且只有在顶层容器中才会开启线程。(backgroundProcessorDelay=10 标志位来控制)

Servlet 生命周期

图片

Servlet 是用 Java 编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。

  1. 请求到达 server 端,server 根据 url 映射到相应的 Servlet

  2. 判断 Servlet 实例是否存在,不存在则加载和实例化 Servlet 并调用 init 方法

  3. Server 分别创建 Request 和 Response 对象,调用 Servlet 实例的 service 方法(service 方法内部会根据 http 请求方法类型调用相应的 doXXX 方法)

  4. doXXX 方法内为业务逻辑实现,从 Request 对象获取请求参数,处理完毕之后将结果通过 response 对象返回给调用方

  5. 当 Server 不再需要 Servlet 时(一般当 Server 关闭时),Server 调用 Servlet 的 destroy() 方法。

load on startup

当值为 0 或者大于 0 时,表示容器在应用启动时就加载这个 servlet;当是一个负数或者没有指定时,则指示容器在该 servlet 被选择时才加载;正数的值越小,启动该 servlet 的优先级越高。

single thread model

每次访问 servlet,新建 servlet 实体对象,但并不能保证线程安全,同时 Tomcat 会限制 servlet 的实例数目。最佳实践:不要使用该模型,servlet 中不要有全局变量。

请求处理过程

图片

  1. 根据 server.xml 配置的指定的 connector 以及端口监听 http、或者 ajp 请求

  2. 请求到来时建立连接,解析请求参数,创建 Request 和 Response 对象,调用顶层容器 Pipeline 的 invoke 方法

  3. 容器之间层层调用,最终调用业务 servlet 的 service 方法

  4. Connector 将 response 流中的数据写到 socket 中

Pipeline 与 Valve

图片

Pipeline 可以理解为现实中的管道,Valve 为管道中的阀门,Request 和 Response 对象在管道中经过各个阀门的处理和控制。

每个容器的管道中都有一个必不可少的 basic valve,其他的都是可选的,basic valve 在管道中最后调用,同时负责调用子容器的第一个 valve。

Valve 中主要的三个方法:setNext、getNext、invoke。Valve 之间的关系是单向链式结构,本身 invoke 方法中会调用下一个 Valve 的 invoke 方法。

各层容器对应的 basic valve 分别是 StandardEngineValve、StandardHostValve、StandardContextValve、StandardWrapperValve。

JSP引擎

图片

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 解析过程

图片

  • 代码片段:在 _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 多路复用

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

现在正是金三银四的春招高潮,前阵子小编一直在搭建自己的网站,并整理了全套的**【一线互联网大厂Java核心面试题库+解析】:包括Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等**

image

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-pWSPn91b-1712769144433)]

最后

现在正是金三银四的春招高潮,前阵子小编一直在搭建自己的网站,并整理了全套的**【一线互联网大厂Java核心面试题库+解析】:包括Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等**

[外链图片转存中…(img-gAAuPxma-1712769144434)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-QZUm7XjT-1712769144434)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值