当前位置:首页 > 公众号精选 > 架构师社区
[导读]从第一次接触 Servlet 到之后的很长一段时间内,我都没理解 Servlet 是个什么玩意? 为什么要有 Servlet ? 为什么要有 Servlet 容器? 啥又是 Web 容器、HTTP 服务器? 今儿咱们就来盘盘!

以下代码相信大家都很熟悉,大学时学 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 到了。

想必大家都听过“计算机科学中的每个问题都可以用一间接层解决”。

是的,基本上所有问题抽象一层都能解决。

如果一层不够,那就两层。

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:

长按订阅更多精彩▼

如有收获,点个在看,诚挚感谢

免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

2024年4月11日,中国——意法半导体的ST25R100近距离通信(NFC)读取器芯片独步业界,集先进的技术功能、稳定可靠的通信连接和低廉的成本价格于一身,在大规模制造的消费电子和工控设备内,可以提高非接触式互动功能的...

关键字: 嵌入式 数据读取器 芯片

单片机是一种嵌入式系统,它是一块集成电路芯片,内部包含了处理器、存储器和输入输出接口等功能。

关键字: 单片机 编写程序 嵌入式

深圳2024年4月23日 /美通社/ -- 全球AI解决方案与工业级存储领导品牌宜鼎国际 (Innodisk)持续深化边缘AI布局,今(23)日发表全球首创"MIPI over Type-C"独家技术,让旗下嵌入式相机模...

关键字: AI 嵌入式 相机

为增进大家对嵌入式主板的认识,本文将对嵌入式主板以及嵌入式主板常见问题及其解决方法予以介绍。

关键字: 嵌入式 指数 主板

为增进大家对嵌入式系统的认识,本文将对嵌入式系统、嵌入式系统的特点予以介绍。

关键字: 嵌入式 指数 嵌入式系统

为增进大家对嵌入式的认识,本文将对嵌入式、嵌入式工作相关的内容予以介绍。

关键字: 嵌入式 指数 嵌入式技术

机器人操作系统(ROS)驱动程序基于ADI产品而开发,因此可直接在ROS生态系统中使用这些产品。本文将概述如何在应用、产品和系统(例如,自主导航、安全气泡地图和数据收集机器人)中使用和集成这些驱动程序;以及这样将如何有助...

关键字: 电机控制器 机器人 嵌入式

支持高达48V@5A的PD受电模式,达到目前USB PD最高标准。

关键字: 嵌入式 开发板

【2024年4月8日,德国慕尼黑讯】低碳化和数字化是当今时代人们面临的两大核心挑战,人类社会需要依靠创新和先进的技术,才能破除挑战、推动转型进程。在德国纽伦堡举办的2024国际嵌入式展(Embedded World 20...

关键字: 半导体 微控制器 嵌入式

TDK 株式会社(TSE:6762)进一步扩充 Micronas 嵌入式电机控制器系列 HVC 5x,完全集成电机控制器与 HVC-5222D 和 HVC-5422D,以驱动小型有刷(BDC)、无刷(BLDC)或步进电机...

关键字: 嵌入式 电机控制器 内存
关闭
关闭