前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >(一)Servlet 工作原理解析 -- 第一讲 Servlet 容器

(一)Servlet 工作原理解析 -- 第一讲 Servlet 容器

作者头像
阿凯
发布于 2018-06-29 04:34:28
发布于 2018-06-29 04:34:28
1.1K00
代码可运行
举报
文章被收录于专栏:程序员阿凯程序员阿凯
运行总次数:0
代码可运行

阅读文本大概需要 10 分钟。

初学 Java Web 开发,请远离各种框架,从 Servlet 开始。 那么Servlet 到底是什么呢?

先说概念:事实上,Servlet 就是一个 Java 接口interface

那 Servlet 是干嘛的?很简单,接口的作用是什么?

一样的 定义规范...

Servlet 接口定义的是一套处理网络请求的规范,所有实现 Servlet 的类,都需要实现它那五个方法,其中最主要的是两个生命周期方法 init() 和 destroy() ,还有一个处理请求的 service() ,也就是说,所有实现 Servlet 接口的类,或者说,所有想要处理网络请求的类,都需要回答这三个问题:

  • - 你初始化时要做什么
  • - 你接受到请求时要做什么
  • - 你销毁时要做什么

这是Java给的一种规范!

Servlet 是一个规范,那实现了 Servlet 的类,就能直接处理请求了吗?

不能,Servlet 并不会直接和客户端打交道 !我们写的 Servlet 程序都需要部署到一个容器中,不然你的 Servlet 压根不会起作用。比如我们最常用的 Tomcat。

Tomcat才是与客户端直接打交道的家伙,他监听了端口,请求过来后,根据 url 等信息,确定要将请求交给哪个Servlet 去处理,然后调用那个 Servlet 的 service() 方法,service 方法返回一个 response 对象,tomcat再把这个 response 返回给客户端。

要介绍 Servlet 必须要先把 Servlet 容器说清楚

Servlet 与 Servlet 容器的关系有点像枪和子弹的关系,枪是为子弹而生,而子弹又让枪有了杀伤力。

虽然它们是彼此依存的,但是又相互独立发展,从技术角度来说是为了解耦,通过标准化接口来相互协作。Servlet 要求必须运行在 Web 服务器当中,与 Web 服务器之间属于分工和互补关系。

确切的说,在实际运行的时候 Servlet 与 Web 服务器会融为一体,如同一个程序一样,运行在同一个Java虚拟机(JVM)当中。因为JavaServlet 是运行在虚拟机之上的,也就解决了跨平台问题。如果没有 Servlet 的出现,也就没有互联网的今天。

我们这里以大家最为熟悉 Tomcat 为例来介绍 Servlet容器 如何管理 Servlet 。

Tomcat 容器模型

从上图可以看出 Tomcat 的容器分为四个等级,真正管理 Servlet 的容器是 Context 容器,一个 Context 对应一个 Web 工程,在 Tomcat 的配置文件(server.xml) 中可以很容易发现这一点,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1<Context path="/projectxxx " docBase= "D:\projects\projectxxx" reloadable="true" />

下面详细介绍一下 Tomcat 解析 Context 容器的过程,包括如何构建 Servlet 的过程。既然接口是连接 Servlet 与 Servlet 容器的关键,那我们就从它们的接口说起。

1.Servlet 容器的启动过程

创建一个Tomcat的一个实例对象,新增了一个WEB应用 (Tomcat的addWebap方法 ),并调用start方法就可以启动 tomcat。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1Tomcat tomcat = getTomcatInstance(); 
2File appDir = new File(getBuildDirectory(), "webapps/examples"); 
3tomcat.addWebapp(null, "/examples", appDir.getAbsolutePath()); 
4tomcat.start(); 
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1public Context addWebapp(Host host, String url, String path) {  
 2    silence(url);  
 3    Context ctx = new StandardContext();  
 4    ctx.setPath( url );  
 5    ctx.setDocBase(path);  
 6    if (defaultRealm == null) {  
 7        initSimpleAuth();  
 8    }  
 9    ctx.setRealm(defaultRealm);  
10    ctx.addLifecycleListener(new DefaultWebXmlListener());  
11    ContextConfig ctxCfg = new ContextConfig();  
12    ctx.addLifecycleListener(ctxCfg);  
13    ctxCfg.setDefaultWebXml("org/apache/catalin/startup/NO_DEFAULT_XML");  
14    if (host == null) {  
15        getHost().addChild(ctx);  
16    } else {  
17        host.addChild(ctx);  
18    }  
19    return ctx;  
20}  

一个 Web 应用对应一个 Context 容器,也就是 Servlet 运行时的 Servlet 容器。

添加一个 Web 应用时将会创建一个 StandardContext 容器,并且给这个 Context 容器设置必要的参数,url 和 path 分别代表这个应用在 Tomcat 中的访问路径和这个应用实际的物理路径,这两个参数与 Tomcat 配置中的两个参数是一致的。

其中最重要的一个配置是 ContextConfigContextConfig 类 负责整个WEB应用的配置文件的解析工作,后面将会详细介绍。

最后将这个 Context 容器加到父容器 Host 中。接下去将会调用 Tomcat 的 start 方法启动 Tomcat。

2.Web应用的初始化工作

WEB应用的初始化工作是在 ContextConfig configureStart 方法中实现的,应用的初始化工作主要是解析 web.xml文件,这个文件是一个WEB应用的入口。

Tomcat 首先会找 globalWebXml,以及应用的配置文件 web.xml 文件中的各个配置项将会被解析成相应的属性保存在 WebXml 对象中。接下来会将 WebXml 对象中的属性设置到 context 容器中,这里包括创建 Servlet 对象,filter,listerner等。

将 Servlet 容器包装成 context 容器中的 StandardWrapper

StandardWrapper 是 Tomcat 容器中的一部分,它具有容器的特征,而 Servlet 作为一个独立的 web 开发标准,不应该强制耦合在Tomcat中。

3.创建Servlet对象

前面完成了Servlet 的解析工作,并且被包装成了 StandardWrapper 添加到Context 容器中,但是它仍然不能为我们工作,它还没有被实例化。

如果Servlet的 load-on-startup 配置项大于 0,那么在Context容器启动时就会被实例化。

前面提到的在解析配置文件时会读取默认的 globalWebXml ,在conf 下的web.xml 文件中定义了一些默认的配置项,其中定义了两个Servlet,分别是org.apache.catalina.servlets.DefaultServlet 和 org.apache.jsper.Servlet .JspServelt,它们的 load-on-startup 分别是1和3,也就是当 tomcat 启动时这两个Servlet 就会被启动。

创建 Servlet 实例的方式是从 Wrapper.loadServlet 开始的,loadServlet 方法要完成的就是获取 servletClass,然后把它交给 InstanceManager 去创建一个基于 servletClass.class 的对象。

4.初始化Servlet对象

初始化 Servlet 在 StandardWrapper 的 initServlet() 方法中,这个方法很简单,就是调用 Servlet 的 init()方法,同时把包装了 StandardWrapper 对象的 StandardWrapperFacade 作为 ServletConfig传给 Servlet。

如果该 Servlet 关联的是一个 JSP 文件,那么前面初始化的就是 JspServlet,接下来会模拟一次简单请求,请求调用这个JSP文件,以便编译这个JSP文件为类,并初始化这个类。

这样Servlet对象的初始化就完成了。

如果算上监听器的话,整个过程是这样的:

  1. 启动web项目后,web容器首先回去找 web.xml文件,读取这个文件。
  2. 容器会创建一个 ServletContext ( servlet 上下文),整个 web 项目的所有部分都将共享这个上下文。
  3. 容器将 转换为键值对,并交给 servletContext
  4. 容器创建 中的类实例,创建监听器。
  5. 容器加载 filter,创建过滤器, 要注意对应的filter-mapping一定要放在filter的后面。
  6. 容器加载 servlet,加载顺序按照 Load-on-startup 来执行

因此它的完整加载顺序就是 :

ServletContext -> context-param -> listener-> filter -> servlet

简单的说,我们在浏览器点击链接和按钮产生的消息不是发送给 Servlet 的,而是发送给 web 容器的 (在 JSP 出现之前,web 容器也叫 Servlet 容器 )。

web 容器接收消息后不知道怎么处理,转交给我们编写的Servlet 处理

那么web容器怎么和Servlet 交流呢?于是就出现了Servlet 接口,接口是定义一种规范的良好表达形式。 只要我们编写符合 Servlet 规范的 Java 类,那么就能被Web容器识别并被容器管理。

以上。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-05-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员阿凯 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
servlet的工作原理_servlet的作用
1. Servlet容器 Servlet是运行Servlet容器的基础之上的,所以了解Servlet工作原理就得先从Servlet容器说起,以Tomact为例:
全栈程序员站长
2022/11/09
3090
servlet的工作原理_servlet的作用
从servlet容器说起1 Servlet容器的启动过程2 Web 应用的初始化工作
要介绍 Servlet 必须要先把 Servlet 容器说清楚,Servlet 与 Servlet 容器的关系有点像枪和子弹的关系,枪为弹而生,而弹又让枪有了杀伤力。虽然它们是彼此依存的,但是又相互独立发展,这一切都是为了适应工业化生产。从技术角度来说是为了解耦,通过标准化接口来相互协作。既然接口是连接 Servlet 与 Servlet 容器的关键,那我们就从它们的接口说起。 Servlet 容器作为一个独立发展的标准化产品,目前种类很多,但是它们都有自己的市场定位,很难说谁优谁劣。以大家最为熟悉 Tom
JavaEdge
2018/05/16
1K0
JavaWeb第一讲 Servlet的工作原理及生命周期
由上图可以看出,在Tomcat下有一个Container容器,这个容器有什么作用?它装载了我们所有的JavaWeb项目,当我们每创建一个JavaWeb项目,Tomcat就会把它“装进”Container容器里。而在这个大容器下,它又“装载着”Servlet容器,可是它是我们今天的主角吗?依然不是。
易兮科技
2020/09/26
8620
Spring学习笔记(4)一SpringMVC启动原理和WebApplicationContext
在分析SpringMVC框架具体组件之前,我们先了解Spring WebApplicationContext。
黄规速
2022/04/14
5610
Spring学习笔记(4)一SpringMVC启动原理和WebApplicationContext
Java Servlet工作原理问答
本文来自stackoverflow的问答,讨论了Java Servlet的工作机制,如何进行实例化、共享变量和多线程处理。
哲洛不闹
2018/09/19
6050
Java Servlet工作原理问答
servlet/tomcat等容器/springMVC之间的关系
Servlet是JavaEE规范的一种,主要是为了扩展Java作为Web服务的功能,统一接口。由其他内部厂商如tomcat,jetty内部实现web的功能。如一个http请求到来: 容器将请求封装为servlet中的HttpServletRequest对象,调用init(),service()等方法输出response,由容器包装为httpresponse返回给客户端的过程。
Monica2333
2020/06/19
1.2K0
javaweb(1) - Servlet
main method 作为入口,客户端本身也是服务端,运行结果往往是实时反馈的.
惊羽-布壳儿
2022/06/15
2590
javaweb(1) - Servlet
Tomcat - Tomcat 8.5.55 启动过程源码分析阶段三_start阶段
Tomcat - Tomcat 8.5.55 启动过程源码分析阶段二_load加载初始化
小小工匠
2021/08/17
2440
Servlet详解
Servlet是server+Applet的缩写,表示一个服务器应用。Servlet就是一套规范,按照这套规范写的代码就可以直接在Java服务器上面运行。
秋白
2019/02/21
5990
Servlet详解
Servlet学习知识总结
什么是Servlet Servlet是一个功能,如果你希望你的项目功能多一些,那就要多写一此Servlet; Servlet是JavaWeb三大组件之一,也是最重要的组件! Ø 三大组件:Servlet、Filter、Listener Servlet是一个我们自定义的Java类,它必须要实现javax.servlet.Servlet接口。 Servlet是动态资源! Servlet必须在web.xml中进行配置后,才能被访问。(把Servlet与一个或多个路径绑定在一起) 2如何实现Servlet 实现
Java帮帮
2018/03/19
4810
Servlet学习知识总结
创建servlet的4个步骤_映射不能一对多还是多对一
一,Servlet接口实现类:sun公司为Servlet接口定义了两个默认的实现类,分别为:GenericServlet和HttpServlet。 HttpServlet:指能够处理HTTP请求的servlet,它在原有的Servlet接口上添加了一与HTTP协议处理的方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。 HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如果为GET请求,则调用HttpServlet的doGet方法,如果为POST请求,则调用doPost方法。因此开发人员在编写Servlet时,通常只需要覆写doGet方法或者doPost方法,而不要去覆写service方法。
全栈程序员站长
2022/08/04
7510
WebXml文件与SpringMVC的联系
无论采用何种框架来进行Java Web的开发,只要是Web项目必须在WEB-INF下有web.xml,这是java规范。 当然,我们最早接触到Java Web容器通常是tomcat,但这并不意味着web.xml是属于Tomcat的,同样,Servlet本身也不属于Tomcat,它与JSP等是Java Web的基础规范。而Servlet的运行需要有Servlet容器的支持,常见的容器有Tomcat、Jetty、JBoss等。
w4ngzhen
2023/10/16
3200
WebXml文件与SpringMVC的联系
servlet生命周期
    1,Servlet容器启动时自动装载某些Servlet,实现它只需要在web.XML文件中的<Servlet></Servlet>之间添加如下代码:
全栈程序员站长
2022/08/05
2260
JavaWeb中web.xml初始化加载顺序
需求说明 做项目时,为了省事,起初把初始化的配置都放在每个类中 static加载,初始化配置一多,就想把它给整理一下,这里使用servlet中的init方法初始化。 web.xml说明 首先了解下web.xml中元素的加载顺序: 启动web项目后,web容器首先回去找web.xml文件,读取这个文件 容器会创建一个 ServletContext ( servlet 上下文),整个 web 项目的所有部分都将共享这个上下文 容器将 转换为键值对,并交给 servletContext 容器创建 中的类实例,创建
小柒2012
2018/04/13
6880
面试之Spring的启动原理
为什么突然说一下Spring启动原理呢,因为之前面试的时候,回答的那可谓是坑坑洼洼,前前后后,补补贴贴。。。
Java技术债务
2022/08/09
2450
面试之Spring的启动原理
Servlet工作原理解析(二)「建议收藏」
上一篇文章简单介绍了Servlet容器的启动、初始化的过程,(链接在这里Servlet工作原理解析(一)),接下来介绍Servlet的创建以及实例化。
全栈程序员站长
2022/11/09
3860
Servlet工作原理解析(二)「建议收藏」
创建Servlet实例1 创建 Servlet 对象2 初始化 Servlet
已经完成了 Servlet 的解析工作,并且被包装成 StandardWrapper 添加在 Context 容器中,但它仍不能为我们工作,以为还未被实例化。下面将介绍 Servlet 对象是如何创建及初始化的。 1 创建 Servlet 对象 如果 Servlet 的 load-on-startup 配置项大于 0,那么在 Context 容器启动的时候就会被实例化,上文提到在解析配置文件时会读取默认的 globalWebXml,在 conf 下的 web.xml 文件中定义了一些默认的配置项,其定义了两
JavaEdge
2018/05/16
8770
不知道这些Servlet规范、容器,还敢说自己是Java程序员?
浏览器发给服务端的是一个HTTP格式的请求,HTTP服务器收到这个请求后,需要调用服务端程序来处理。
JavaEdge
2021/10/18
1.2K0
Tomcat源码解析(五):StandardEngine、StandardHost、StandardContext、StandardWrapper
Tomcat源码解析(四):StandardServer和StandardService
冬天vs不冷
2025/01/21
580
Tomcat源码解析(五):StandardEngine、StandardHost、StandardContext、StandardWrapper
不知道这些Servlet规范、容器,还敢说自己是Java程序员?
实现Web动态内容的技术,最早使用的是CGI(Common Gateway Interface,通用网关接口)技术,根据用户输入的请求动态地传送HTML数据。 CGI并不是开发语言,而只是能够利用为它编写的程序来实现Web服务器的一种协议。 可用来实现电子商务网站、搜索引擎处理和在线登记等功能。当用户在Web页面中提交输入的数据时,Web浏览器就会将用户输入的数据发送到Web服务器上。在服务器上,CGI程序对输入的数据进行格式化,并将这个信息发送给数据库或服务器上运行的其他程序,然后将结果返回给Web服务器。最后,Web服务器将结果发送给Web浏览器,这些结果有时使用新的Web页面显示,有时在当前Web页面中显示。
JavaEdge
2021/12/07
4990
不知道这些Servlet规范、容器,还敢说自己是Java程序员?
推荐阅读
相关推荐
servlet的工作原理_servlet的作用
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验