为什么要有 Servlet ,什么是 Servlet 容器,什么是 Web 容器?
本文已收录至 https://github.com/yessimida/yes ,这里有我的所有文章分类汇总,欢迎 star!
以下代码相信大家都很熟悉,大学时学 Java Web 都写过这样的代码。
从第一次接触 Servlet 到之后的很长一段时间内,我都没理解 Servlet 是个什么玩意?
为什么要有 Servlet ?
为什么要有 Servlet 容器?
啥又是 Web 容器、HTTP 服务器?
今儿咱们就来盘盘,并且从中来看看架构和框架的设计套路。
看完之后可能对接口、抽象会有进一步的认识。
来,上车!
正文
首先浏览器发起 HTTP 请求,像早期的时候只会请求一些静态资源,这时候需要一个服务器来处理 HTTP 请求,并且将相应的静态资源返回。
这个服务器叫 HTTP 服务器。
简单点说就是解析请求,然后得知需要服务器上面哪个文件夹下哪个名字的静态文件,找到返回即可。
而随着互联网的发展,交互越发得重要,单纯的静态文件满足不了需求。
业务变得复杂,需要我们编写代码来处理诸多业务。
需要根据 HTTP 请求调用不同的业务逻辑来响应,但是我们的业务代码不能跟 HTTP 服务器耦合起来。
总不能在 HTTP 服务器的具体实现里面来做判断到底需要调用哪个业务类吧?
这就把非业务和业务强相关了。
所以需要做一层抽象,将 HTTP 的解析和具体的业务隔离。
本质上的需求就是根据 HTTP 请求找到对应的业务实现类然后执行逻辑再返回。
而业务千千万,所以需要规定一个接口,所以业务类都实现这个接口这样才好对接。
这就是接口的含义,就像 USB。
这个接口就是 Servlet,当然这是最狭义的解释。
Servlet 其实是 Server Applet,全称 Java Servlet,指的是用Java 编写的服务端程序。
其实指代的是实现 Servlet 接口的那些业务类。
这就是 Servlet 的由来。
而 Servlet 容器其实就是管理和加载这些 Servlet 类的,拿到 HTTP 请求之后找到对应的 Servlet 类这就是 Servlet 容器要做的事情。
看到这是不是觉得还能再抽一层?因为这好像也和具体的业务实现没关系?
是的,还能抽一层。
没必要把 Servlet 容器做的事情和具体的业务耦合起来,业务反正照着 Servlet 接口实现就行,这样 Servlet 容器就可以加载它和管理它。
把请求和哪个 Servlet 对应关系也抽象出来,就是 web.xml 了,咱们在配置里面告诉 Servlet 容器对应关系即可。
我图中的业务实现其实对应的就是我们平常的 war 包,这就是业务和 Servlet 容器的解耦。
想必你也听过 Servlet 规范,其实 Servlet 接口和 Servlet 容器这一整套包括目录命名啊啥的合起来就叫 Servlet 规范。
所有相关的中间件按照 Servlet 规范实现,我们也按 Servlet 规范来实现业务代码,这样我们就能在不同场景选择不同的 Web 中间件。
反正规范的目的就是为了对接方便,减少对接成本。
至此 HTTP 服务器、Servlet 、Servlet 容器想必都清晰了。
而 Web 容器其实就是 HTTP 服务器 + Servlet 容器,因为单单 Servlet 容器没有解析 HTTP 请求、通信等相关功能。
所以把 Tomcat、Jetty 等实现包含了 HTTP 服务器和 Servlet 容器的功能,称之为 Web 容器。
从我们的分析一层一层的剥离,一层一层的抽象,相信你对 Web 有了更进一步的认识,我再画个 Tomcat 的分析图,应该就很清晰了。
从上面的一步步分析可以看出:其实架构的设计就是一系列相关的抽象。
先是抽象出 HTTP 服务,用来通信和解析协议。
再因为业务的复杂,为了不和 HTTP 服务耦合又抽象了一层 Servlet。
由 Servlet 加载和管理 Servlet ,来控制请求转发到指定的 Servlet 实现类。
然后我们安心的开发业务即可。
因为抽象所以灵活易扩展,比如现在是 HTTP1.1 服务,可以换成 HTTP 2。
现在用 Tomcat 来作为 Servlet 容器,也可以换成 Jetty。
现在用原生的实现 Servlet 来做业务,也可以换成 SpringMVC。
随意变更,因为都抽象出来了,就很好替换,只要遵循约定的接口实现即可。
框架设计的一个套路
看完了架构设计的套路,再说说框架套路。
接口和抽象类。
所有中间件设计必用的套路,当然我们自己的代码也会这样用。
先定义一个接口来约定一些动作,能做啥做啥。
然后再定义一个抽象类来实现这个接口,用来实现一些通用的逻辑,做到代码的复用。
然后再搞一些常用的实现类继承抽象类,方便开发者的使用。
剩下的就留给开发者自行扩展即可。
然后抽象类都会使用模板方法,也就是定义执行的流程,具体实现逻辑由子类自行实现。
这就是必用的套路。
接口约束、抽象类代码复用、实现常用实现类方便使用、剩下的自行扩展。
拿 Servlet 举例,首先定义 Servlet 接口。
public interface Servlet {
void init(ServletConfig config) throws ServletException;
ServletConfig getServletConfig();
void service(ServletRequest req, ServletResponse res)throws ServletException, IOException;
String getServletInfo();
void destroy();
}
然后搞了个通用抽象类 GenericServlet,不过这个抽象类逻辑比较简单。
public abstract class GenericServlet implements Servlet, ServletConfig,
java.io.Serializable {
................省略一些.............
@Override
public ServletConfig getServletConfig() {
return config;
}
@Override
public ServletContext getServletContext() {
return getServletConfig().getServletContext();
}
@Override
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
................省略一些.....................
}
然后搞了个常用的 HttpServlet 继承了 GenericServlet。
public abstract class HttpServlet extends GenericServlet {
private static final long serialVersionUID = 1L;
private static final String METHOD_DELETE = "DELETE";
private static final String METHOD_HEAD = "HEAD";
private static final String METHOD_GET = "GET";
....................
}
套路就是这么个套路,之后面试官问你接口和抽象类的问题,相信你也能答出来了。
最后
套路大家应该都 GET 到了。
想必大家都听过“计算机科学中的每个问题都可以用一间接层解决”。
是的,基本上所有问题抽象一层都能解决。
如果一层不够,那就两层。
欢迎加我好友进行深入地交流,备注「进群」,拉你进交流&内推群。
平日的面试题遇到难处,或者看某个知识点翻遍全网的资料还是感觉很模糊、不透彻,可以私聊我,给我留言。
遇到合适的我会整理写出一篇文章,我不会的去请教别人也给整出来。
那种工作遇到很细节的场景的还是别了,这种问你上司比较合适:)
欢迎关注我的公众号【yes的练级攻略】,更多硬核文章等你来读。
巨人的肩膀
《深入拆解Tomcat & Jetty》 李号双
微信搜索【yes的练级攻略】,关注 yes,回复【123】一份20W字的算法刷题笔记等你来领,从一点点到亿点点,我们下篇见。
个人文章汇总:https://github.com/yessimida/yes 欢迎 star !
为什么要有 Servlet ,什么是 Servlet 容器,什么是 Web 容器?的更多相关文章
- spring容器和springmvc容器,以及web容器的关系
说到spring和springmvc,其实有很多人分不清他们有什么区别,认为它俩是一样的,如果你问他项目里用的什么MVC技术,他会说我们用的spring和mybatis,或者spring和hibern ...
- servlet入门学习之Web容器
一.web服务器 web服务器(程序/软件) 即:www服务器或http服务器.提供Web信息浏览服务.它只需支持HTTP协议.HTML文档格式及URL.向浏览器提供服务的程序. 1.Web服务器是指 ...
- 各种容器与服务器的区别与联系:Servlet容器、WEB容器、Java EE容器、应用服务器、WEB服务器、Java EE服务器
1.容器与服务器的联系 如上图,我们先来看下容器与服务器的联系:容器是位于应用程序/组件和服务器平台之间的接口集合,使得应用程序/组件可以方便部署到服务器上运行. 2.各种容器的区别/联系 2-1.容 ...
- 各种容器与服务器的区别与联系 Servlet容器 WEB容器 Java EE容器 应用服务器 WEB服务器 Java EE服务器
转自:https://blog.csdn.net/tjiyu/article/details/53148174 各种容器与服务器的区别与联系 Servlet容器 WEB容器 Java EE容器 应用服 ...
- Eclipse创建第一个Servlet(Dynamic Web Project方式)、第一个Web Fragment Project(web容器向jar中寻找class文件)
创建第一个Servlet(Dynamic Web Project方式) 注意:无论是以注解的方式还是xml的方式配置一个servlet,servlet的url-pattern一定要以一个"/ ...
- Spring 在web 容器中的启动过程
1.对于一个web 应用,其部署在web 容器中,web 容器提供其一个全局的上下文环境,这个上下文就是 ServletContext ,其后面的spring IoC 容器提供宿主环境 2.在web. ...
- Geronimo tomcat: 在 Apache Geronimo 插件体系中将 Apache Tomcat 这个优秀的 Web 容器整合至其中
Apache Geronimo 灵活的插件体系将 Tomcat, OpenJPA, OpenEJB, ActiveMQ 等第三方组件集成至其中.本文从多角度介绍了在 Apache Geronimo 中 ...
- 简述Spring容器与SpringMVC的容器的联系与区别
简述Spring容器与SpringMVC的容器的联系与区别 2017年07月04日 10:55:07 阅读数:6260 摘要: 在Spring整体框架的核心概念中,容器的核心思想是管理Bean的整个生 ...
- Tomcat Jboss Glassfish 三种常见web容器比较
一.缘由: 新公司平台是纯Java架构,有用到Java Web(JSP).Java 业务(EJB).Nginx..Websphere MQ.Mysql这样.大家知道java是跑在容器里的, 这里的业务 ...
- Web容器自己主动对HTTP请求中參数进行URLDecode处理
这篇文章转载自 : Web容器自己主动对HTTP请求中參数进行URLDecode处理 如题.在Java中或许非常多人都没有注意到当我们发送一个http请求时,假设附带的參数被URLEncode之后,到 ...
随机推荐
- 【JVM第三篇--运行时数据区】程序计数器、虚拟机栈、本地方法栈
写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.运行时数据区 我们在编写Java程序时,使用JVM的流程主要如下所示: 虚拟机在 ...
- 论文学习笔记 - 高光谱 和 LiDAR 融合分类合集
A³CLNN: Spatial, Spectral and Multiscale Attention ConvLSTM Neural Network for Multisource Remote Se ...
- mds/journal.cc: 2929: FAILED assert解决
前言 在处理一个其他双活MDS无法启动环境的时候,查看mds的日志看到了这个错误mds/journal.cc: 2929: FAILED assert(mds->sessionmap.get_v ...
- 转载 数据库优化 - SQL优化
判断问题SQL判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象CPU消耗严重IO等待严重页面响应时间过长应用的日志出现超时等错误可以使用sar命令,top命令查看当前系统状态. 也可以通 ...
- 【干货!!】十分钟带你搞懂 Java AQS 核心设计与实现!!!
前言 这篇文章写完放着也蛮久的了,今天终于发布了,对于拖延症患者来说也真是不容易-哈哈哈. 言归正传,其实吧..我觉得对于大部分想了解 AQS 的朋友来说,明白 AQS 是个啥玩意儿以及为啥需要 AQ ...
- 批量反编译.class
使用dj java Decompiler软件,安装后,安装目录会有个jad.exe程序 控制台执行: jad -o -r -dF:\output_dir -sjava F:\class_root_di ...
- 【转】Java工程师知识图谱
一.Java工程师知识图谱(思维导图版) 二.Java工程师知识图谱(文字链接版) 专业基石 数据结构 数组 链表 队列 栈 哈希表 堆 树 图 BitMap 算法思想 排序 查找 分支算法 动态规划 ...
- 如何用FL Studio做电音
电音制作,自然少不了适合做电音的软件,市面上可以进行电音制作的软件不少,可是如果在这些软件中只能选择一款的话,想必多数人会把票投给FL Studio,毕竟高效率是永远不变的真理,今天就让我们来看看如何 ...
- guitar pro 系列教程(六):Guitar Pro音频导出功能之RSE音源
让我们继续进行guitar pro的教程 上一章节,我们讲解了guitar Pro的播放与显示功能,在Guita pro的音源选择中分为两类,一种是自带的RES高保真音源,一种是MIDI输入音源.如果 ...
- python基础之条件语句
检查相等和不等 多个检查条件 age1 = 22 age2 = 19 s1 = age1 > 21 and age2 > 19 print(s1) s2 = age1 > 21 or ...