servlet、tomcat及Mybatis底层源码解析
时间:2023-07-12 14:27:02 | 来源:网站运营
时间:2023-07-12 14:27:02 来源:网站运营
servlet、tomcat及Mybatis底层源码解析:
训练大纲(第105天)
大家如果想快速有效的学习,思想核心是“以建立知识体系为核心”,具体方法是“守破离”。确保老师课堂上做的操作,反复练习直到熟练。
第209次(源码分析)
学习主题:源码分析
学习目标:
对应视频:
http://www.itbaizhan.cn/course/id/85.html对应文档:
无
对应作业
- Tomcat和Servlet源码分析
- 写出Tomcat重要的类以及作用
Server:服务器的意思,代表整个 tomcat 服务器,一个 tomcat 只有一个 Server. Server 中包含至少一个 Service 组件,用于提供具体服务。这个在配置文件中也得到很 好的体现(port=“8005” shutdown="SHUTDOWN"是在 8005 端口监听到"SHUTDOWN"命 令,服务器就会停止)
Servic:逻辑功能层, 一个 Server 可以包含多个 Service.Service 接收客户端的请求,然后解析请求,完成相应的业务逻辑,然后把处理后的结 果返回给客户端,一般会提供两个方法,一个 start 打开服务 Socket 连接,监听服务端口, 一个 stop 停止服务释放网络资源。
Connector:连接器,是 Service 的核心组件之一,一个 Service 可以有多个 Connector,主要是 连接客户端请求,用于接受请求并将请求封装成 Request 和 Response,然后交给 Container 进 行处理,Container 处理完之后在交给 Connector 返回给客户端。
Container:Service 的另一个核心组件,按照层级有 Engine,Host,Context,Wrapper 四种,一个 Service 只有一个 Engine,其主要作用是执行业务逻辑
Engine:一个 Service 中有多个 Connector 和一个 Engine,Engine 表示整个 Servlet 引擎,一个 Engine 下面可以包含一个或者多个 Host,即一个 Tomcat 实例可以配置多个虚拟主机,默认 的情况下 conf/server.xml 配置文件中<Engine name="Catalina" defaultHost="localhost"> 定 义了一个名为 Catalina 的 Engine。一个 Engine 包含多个 Host 的设计,使得一个服务器实例可以承担多个域名的服务
Host:代表一个站点,也可以叫虚拟主机,一个 Host 可以配置多个 Context,在 server.xml 文 件 中 的 默 认 配 置 为 <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">, 其中 appBase=webapps, 也就是<CATALINA_HOME>/webapps 目录, unpackingWARS=true 属性指定在 appBase 指定的目录中的 war 包都自动的解压, autoDeploy=true 属性指定对加入到 appBase 目录的 war 包进行自动的部署。
Context: 代表一个应用程序,就是日常开发中的 web 程序,或者一个 WEB-INF 目录以 及下面的 web.xml 文件,换句话说每一个运行的 webapp 最终都是以 Context 的形式存在, 每个 Context 都有一个根路径和请求路径;与 Host 的区别是 Context 代表一个应用,如,默 认配置下 webapps 下的每个目录都是一个应用,其中 ROOT 目录中存放主应用,其他目录 存放别的子应用,而整个 webapps 是一个站点。
- 写出Servlet重要的类以及作用
Servlet接口:
init:负责初始化 Servlet 对象。容器一旦创建好 Servlet 对象后,就调用此方法来初始化 Servlet 对象
service:负责处理客户的请求并返回响应。当容器接收到客户端要求访问特定的 servlet 请 求时,就会调用 Servlet 的 service 方法
destroy:负责释放 Servlet 对象占用的资源,当 servlet 对象结束生命周期时, servlet 容器调用此方法来销毁 servlet 对象.
getServletInto:返回一个字符串,在该字符串中包含 servlet 的创建者,版本和版权等信息
getServletConfig:返回一个 ServletConfig 对象,该对象中包含了 Servlet 初始化参数信息
ServletConfig接口:
getServletName:用于获取servlet名,web.xml中定义的servlet-name
getServletContext:获取servlet上下文对象
getInitParameter:获取inin-param中的配置参数
getInitParameterNames:获取配置的所有init-param名字集合
GenericServlet: Servlet类的默认实现类,与具体协议无关。在实现Servlet类的同时,也实现了ServletConfig接口和Serialzable接口。在GenericServlet类中唯一没有实现的方法是Servlet类中service方法,是交由子类去实现具体的应用。
HttpServlet:HttpServlet是基于Http协议实现的Servlet基类,在写servlet时直接继承它。在请求响应方法service中,根据请求类型调用不同的方法,写servlet只需要根据请求类型覆盖响应的方法即可
分享/讲解/扩展思考
点名提问从第一节课到最后一节课分别学到了什么,直到同学们把所有的知识点都说出来并且保证无误。
第210次(源码分析)
学习主题:源码分析
学习目标:
对应视频:
http://www.itbaizhan.cn/course/id/85.html对应文档:
无
对应作业
- Mybatis底层源码分析
- 写出Mybatis运行流程
- 写出Mybatis常用类以及作用
Configuration.xml: 该配置文件是 MyBatis 的全局配置文件,在这个文件中可以配置诸多项目。常用的内容 是别名设置,拦截器设置等。
Mapper.xml: Mapper.xml 映射文件中定义了操作数据库的 sql,每个 sql 是一个 statement,映射文件 是 mybatis 的核心
Resources: Resources 工具类会从路径中加载资源,并返回一个输入流对象,对于资源文件的加载 提供了简易的使用方法。
SqlSessionFactoryBuilder: 该类是 SqlSessionFactory(会话工厂)的构建者类,之前描述的操作其实全是从这里面 开启的,首先就是调用 XMLConfigBuilder 类的构造器来创建一个 XML 配置构建器对象, 利用这个构建器对象来调用其解析方法 parse()来完成 Configuration 对象的创建,之后以这 个配置对象为参数调用会话工厂构建者类中的 build(Configuration config)方法来完成SqlSessionFactory(会话工厂)对象的构建。
XMLConfigBuilder: 该类是 XML 配置构建者类, 是用来通过 XML 配置文件来构建 Configuration 对象实例, 构建的过程就是解析 Configuration.xml 配置文件的过程,期间会将从配置文件中获取到的指 定标签的值逐个添加到之前创建好的默认 Configuration 对象实例中。
Configuration: 该对象是 Mybatis 的上下文对象,实例化这个类的目的就是为了使用其对象作为项目全 局配置对象,这样通过配置文件配置的信息可以保存在这个配置对象中,而这个配置对象在 创建好之后是保存在 JVM 的 Heap 内存中的,方便随时读取。不然每次需要配置信息的时 候都要临时从磁盘配置文件中获取,代码复用性差的同时,也不利于开发
DefaultSqlSessionFactory: SqlsessionFactory 该 接 口 是 会 话 工 厂 , 是 用 来 生 产 会 话 的 工 厂 接 口 , DefaultSqlSessionFactory 是其实现类,是真正生产会话的工厂类,这个类的实例的生命周期 是全局的,它只会在首次调用时生成一个实例(单例模式),就一直存在直到服务器关闭
Executor: 执行器接口,SqlSession 会话是面向程序员的,而内部真正执行数据库操作的却是 Executor 执行器,可以将 Executor 看作是面向 MyBatis 执行环境的,SqlSession 就是门面货, Executor 才是实干家。通过 SqlSession 产生的数据库操作,全部是通过调用 Executor 执行器 来完成的。 Executor 是跟 SqlSession 绑定在一起的,每一个 SqlSession 都拥有一个新的 Executor 对 象,由 Configuration 创建。
StatementHandler: 该类是 Statement 处理器,封装了 Statement 的各种数据库操作方法 execute(),可见 MyBatis 其实就是将操作数据库的 JDBC 操作封装起来的一个框架,同时还实现了 ORM 罢 了。RoutingStatementHandler是一个封装类,它不提供具体的实现,只是根据 Executor 的类型,创建不同的类型 StatementHandler。
ResultSetHandler: 结果集处理器,如果是查询操作,必定会有返回结果,针对返回结果的操作,就要使用 ResultSetHandler 来进行处理,这个是由 StatementHandler 来进行调用的。这个处理器的作用 就是对返回结果进行处理。
分享/讲解/扩展思考
点名提问从第一节课到最后一节课分别学到了什么,直到同学们把所有的知识点都说出来并且保证无误。