先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
正文
-
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 内容。
-
请求到达 server 端,server 根据 url 映射到相应的 Servlet
-
判断 Servlet 实例是否存在,不存在则加载和实例化 Servlet 并调用 init 方法
-
Server 分别创建 Request 和 Response 对象,调用 Servlet 实例的 service 方法(service 方法内部会根据 http 请求方法类型调用相应的 doXXX 方法)
-
doXXX 方法内为业务逻辑实现,从 Request 对象获取请求参数,处理完毕之后将结果通过 response 对象返回给调用方
-
当 Server 不再需要 Servlet 时(一般当 Server 关闭时),Server 调用 Servlet 的 destroy() 方法。
load on startup
当值为 0 或者大于 0 时,表示容器在应用启动时就加载这个 servlet;当是一个负数或者没有指定时,则指示容器在该 servlet 被选择时才加载;正数的值越小,启动该 servlet 的优先级越高。
single thread model
每次访问 servlet,新建 servlet 实体对象,但并不能保证线程安全,同时 Tomcat 会限制 servlet 的实例数目。最佳实践:不要使用该模型,servlet 中不要有全局变量。
请求处理过程
-
根据 server.xml 配置的指定的 connector 以及端口监听 http、或者 ajp 请求
-
请求到来时建立连接,解析请求参数,创建 Request 和 Response 对象,调用顶层容器 Pipeline 的 invoke 方法
-
容器之间层层调用,最终调用业务 servlet 的 service 方法
-
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 多路复用
阻塞与非阻塞的区别在于进行读操作和写操作的系统调用时,如果此时内核态没有数据可读或者没有缓冲空间可写时,是否阻塞。
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主要参数
Comet
Comet 是一种用于 Web 的推送技术,能使服务器实时地将更新的信息传送到客户端,而无须客户端发出请求,在 WebSocket 出来之前,如果不使用 comet,只能通过浏览器端轮询 Server 来模拟实现服务器端推送。Comet 支持 servlet 异步处理 IO,当连接上数据可读时触发事件,并异步写数据(阻塞)。
Tomcat 要实现 Comet,只需继承 HttpServlet 同时,实现 CometProcessor 接口。
-
Begin:新的请求连接接入调用,可进行与 Request 和 Response 相关的对象初始化操作,并保存 response 对象,用于后续写入数据
-
Read:请求连接有数据可读时调用
-
End:当数据可用时,如果读取到文件结束或者 response 被关闭时则被调用
-
Error:在连接上发生异常时调用,数据读取异常、连接断开、处理异常、socket 超时
面试结束复盘查漏补缺
每次面试都是检验自己知识与技术实力的一次机会,面试结束后建议大家及时总结复盘,查漏补缺,然后有针对性地进行学习,既能提高下一场面试的成功概率,还能增加自己的技术知识栈储备,可谓是一举两得。
以下最新总结的阿里P6资深Java必考题范围和答案,包含最全MySQL、Redis、Java并发编程等等面试题和答案,用于参考~
重要的事说三遍,关注+关注+关注!
更多笔记分享
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
复盘,查漏补缺,然后有针对性地进行学习,既能提高下一场面试的成功概率,还能增加自己的技术知识栈储备,可谓是一举两得。
以下最新总结的阿里P6资深Java必考题范围和答案,包含最全MySQL、Redis、Java并发编程等等面试题和答案,用于参考~
重要的事说三遍,关注+关注+关注!
[外链图片转存中…(img-9BqcvCHu-1713655905389)]
[外链图片转存中…(img-3oCX8rNJ-1713655905389)]
更多笔记分享
[外链图片转存中…(img-pujsIxDk-1713655905390)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-klmV9Kgl-1713655905391)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!