我从网上找了一张web项目的目录结构,如下:
是不是很熟悉的赶脚^-^
几年之前这是当之无愧的主流,但是随着技术的发展,servlet3.0、springboot的诞生,基于xml配置的web项目一去不复返了,取而代之的是springboot。今天不谈springboot是如何玩的,今天的主题是web.xml是如何消失的。因为当下主流的技术就是spring全家桶,探究的目的也是spring是如何让web.xml消失的。springmvc中的核心是DispacherServlet,在使用的时候会在web.xml中配置<servlet>标签,那么当web.xml消失了,DispacherServlet如何注册到容器中的呢?解决了这个问题也就能回答web.xml消失的原因了。
Servlet3.0
从servlet3.0开始,支持ServletContainerInitializer接口,也就是说提供了一种通过代码层面来初始化servlet容器的方式,比如注册servlet、listener、filter。官方文档中关于ServletContainerInitializer的介绍如下:
ServletContainerInitializer 类通过 jar services API 查找。对于每一个应用,应用启动时,由容器创建一个 ServletContainerInitializer 实例。框架提供的 ServletContainerInitializer 实现必须绑定在 jar 包的 META-INF/services 目录中的一个叫做 javax.servlet.ServletContainerInitializer 的文件,根据 jar services API, 指定 ServletContainerInitializer 的实现。 除 ServletContainerInitializer 外,我们还有一个注解—HandlesTypes。在 ServletContainerInitializer 实现上的 HandlesTypes 注解用于表示感兴趣的一些类,它们可能指定了 HandlesTypes 的 value 中的注解(类型、方 法或自动级别的注解),或者是其类型的超类继承/实现了这些类之一。
简单来说,只要在jar中的特定目录文件下配置ServletContainerInitializer的实现类,servlet容器在启动的过程中就会去调用这个实现类,从而可以达到注册servlet、listener、filter的功能,那么web.xml的用处完全可以被取代了。
spring-web包
对于使用spring很熟悉的朋友肯定知道,在开发web应用时spring-web包是必不可少的,来看看这个包的目录结构
是不是很惊喜?