热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ideaxml文件变普通文件了_SpringBoot的web.xml文件在哪里?

每天叫醒你的不是闹钟,而是梦想01追溯web.xml远古时期,使用servlet做web开发的时候,我们需要配置web.xml文件
618e236c7ffab770bac55dcfb33bccab.gif

每天叫醒你的不是闹钟,而是梦想

01

追溯web.xml

  • 远古时期,使用servlet做web开发的时候,我们需要配置web.xml文件;

  • 近代时期,使用springMVC做web开发的时候,我们需要配置web.xml文件;

  • 现代时期,使用SpringBoot做web开发的时候,我们不需要配置web.xml文件

       这是为什么呢?

02

web.xml干了什么?

要了解SpringBoot为什么不需要配置web.xml文件,我们首先要知道web.xml干了什么,是不是SpringBoot用了什么其他文件代替?

首先我们要从servlet讲起,在servlet-api2.5的时候,我们要注册一个servlet需要引入web.xml,我们需要对每一个请求进行一个类的映射;直到servlet-api3.0的发布,我们注册一个servlet就简单了,只需要引入一个@WebServlet注解。

接着我们进入spring+springmvc(2.5)时代,依旧需要使用web.xml,我们可以了解一下这个时候的web.xml配置文件的内容。

我们去Spring官网查看关于SpringMVC模块提供的web.xml内容

d0992ca0b3b08c841ee8a125533e5320.png

首先是ContextLoaderListener类,该类是指定Spring要加载的配置文件,加载我们的spring配置文件。而在spring的配置文件中,会有


该行代码的作用是扫描业务类(service,dao层的注解)

接着是我们的DispatcherServlet,该作用是加载spring-mvc的配置文件,在spring-mvc的配置文件中

context:component-scan>
该行代码是扫描映射类(controller的注解)

接着是

1
该配置表示容器启动的时候执行DispatcherServlet的init方法

最后是

/*
拦截请求

总结:web.xml需要做的事情就是 加载spring配置文件,加载springmvc文件,注册一个servlet,拦截请求。

03

SpringMVC5用java代码替代了web.xml

那么我们将刚刚的Spring官网上的内容往上翻

76aab6ed4270e8b44eed70b14bb65750.png

我们可以看到这段代码,上面的最后一行文档告诉我们:

以下Java配置实例注册并初始化DispacherServlet,由Servlet容器自动给检测,也就是说,在SpringMVC5的时候,已经由Java代码代替了web.xml配置文件,那么我们来了解一下官网的这段代码。

public class MyWebApplicationInitializer implements WebApplicationInitializer {


@Override
public void onStartup(ServletContext servletCxt) {


  // Load Spring web application configuration 加载spring配置文件
  AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext();
  ac.register(AppConfig.class);
  ac.refresh();


 // Create and register the DispatcherServlet 创建和注册DispatcherServlet
  DispatcherServlet servlet = new DispatcherServlet(ac);
  ServletRegistration.Dynamic registration = servletCxt.addServlet("app", servlet);


  registration.setLoadOnStartup(1); //1
  registration.addMapping("/app/*"); ///app/*
 }
}

所以在spring5的时候,web.xml配置文件已经完全被Java代码取代。这其实就是一个过渡。

在该配置中,我们可以看到的是MyWebApplicationInitializer 实现了WebApplicationInitializer 这个接口,然后在onStartup方法中实现了配置,那么也就是说WebApplicationInitializer 的实现类只要调用了onStartup方法就可以进行一些初始化。

那么其实在servlet-api3.1的标准中定义了一个规范,如果你想要启动容器的时候定义这么一个配置,那么你需要在某个文件夹下(/META-INF/services/javax.servlet.ServletContainerInitializer)定义一个容器时会回调的类,这个类必须要实现ServletContainerInitializer接口,那么在web容器启动时就会做一些初始化工作,而这些初始化工作是在onStartup方法中执行的。

接下来我们看一下ServletContainerInitializer接口

9279c85d51f1fb0480251f8e717a6e92.png

根据注释:为了支持可以不使用web.xml。提供了ServletContainerInitializer这个接口,该接口通过SPI机制,当web容器启动的时候,会自动添加相应jar包下找到META-INF/services/javax.servlet.ServletContainerInitializer文件中的实现类,将他们实例化。

9bd0b894a34c7a4d48ee2bb18e6ce41b.png

于是我们找到了这个文件,该文件下有一个实现类,我们进入这个实现类

@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {


@Override
public void onStartup(@Nullable Set> webAppInitializerClasses, ServletContext servletContext)throws ServletException {

     List initializers &#61; new LinkedList<>();    if (webAppInitializerClasses !&#61; null) {    for (Class> waiClass : webAppInitializerClasses) {       if (!waiClass.isInterface() && !Modifier.isAbstract(waiClass.getModifiers()) &&
           WebApplicationInitializer.class.isAssignableFrom(waiClass)) {        try {
            initializers.add((WebApplicationInitializer)
            ReflectionUtils.accessibleConstructor(waiClass).newInstance());
          }catch (Throwable ex) {            throw new ServletException("Failed to instantiate WebApplicationInitializer class", ex);
        }
       }
    }
}

那么该实现类就会通过SPI机制&#xff0c;在web容器加载的时候会自动被调用&#xff0c;类上的&#64;handlesTypes注解&#xff0c;它的作用是将感兴趣的一些类注入到ServletContainerInitializerde接口中&#xff0c;而这个类的方法就会扫描到WebApplicationIntializer的实现类&#xff0c;调用它的onStartup方法&#xff0c;从而起到了web.xml的作用。因为我们上面已经说过&#xff1a;WebApplicationInitializer 的实现类只要调用了onStartup方法就可以进行一些初始化&#xff0c;也就是加载了web.xml配置。




推荐阅读
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 解决java.lang.IllegalStateException: ApplicationEventMulticaster not initialized错误的方法和原因
    本文介绍了解决java.lang.IllegalStateException: ApplicationEventMulticaster not initialized错误的方法和原因。其中包括修改包名、解决service name重复、处理jar包冲突和添加maven依赖等解决方案。同时推荐了一个人工智能学习网站,该网站内容通俗易懂,风趣幽默,值得一看。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文介绍了将mysql从5.6.15升级到5.7.15的详细步骤,包括关闭访问、备份旧库、备份权限、配置文件备份、关闭旧数据库、安装二进制、替换配置文件以及启动新数据库等操作。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • Jboss的EJB部署描述符standardjaws.xml配置步骤详解
    本文详细介绍了Jboss的EJB部署描述符standardjaws.xml的配置步骤,包括映射CMP实体EJB、数据源连接池的获取以及数据库配置等内容。 ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
author-avatar
零落曦_622
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有