美文网首页Java 杂谈SpringBoot精选Java
使用SpringBoot之后web.xml去哪儿了

使用SpringBoot之后web.xml去哪儿了

作者: SevenLin1993 | 来源:发表于2019-09-26 13:01 被阅读0次
xml.jpeg

web.xml的作用

还记得我们在写Java Web的时候吗,那个时候需要Web工程都需要在WEB-INF下,放置一个web.xml文件,其大概格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <display-name>DEMO</display-name> 
  
  <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>web.filter.CharacterEncodingFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
 
  <servlet>
    <servlet-name>OrderServlet</servlet-name>
    <servlet-class>web.client.OrderServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>OrderServlet</servlet-name>
    <url-pattern>/servlet/OrderServlet</url-pattern>
  </servlet-mapping>
  
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

web.xml是Java EE中可选择用来描述应用部署描述的文件,使得Servlet容器可以加载部署应用,该文件可以用于声明Servlet,Servlet的访问映射,配置监听器等信息,可以用于描述外部资源,详情可以看Servlet 3.0规范:JSR 315

例如,Tomcat在启动部署一个Web应用的时候,会在初始化阶段加载web.xml文件,进而加载Servlet,加载Servet与Api的映射关系,最终才能对外提供服务。

在这个阶段,我们每次开发新的功能,新增新的Servlet都需要修改web.xml文件,配置也比较繁琐

Spring MVC简化web.xml

使用Spring MVC的时候,由于Spring MVC是通过一个Servlet实现的:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
              http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>Spring MVC App</display-name>
 
    <!--字符编码过滤器-->
    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    <servlet>
        <servlet-name>SpringController</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
     
    <servlet-mapping>
        <servlet-name>SpringController</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

这个阶段,web.xml就只需做配置类的设置,基于SpringMVC就无需再自己配置Servlet,只需通过Controller进行开发,然后交给Spring容器管理,整个工程的入口就统一由DispatcherServlet来处理,web.xml得到进一步的简化。

使用Spring Boot免去web.xml

使用Spring Boot进行Web开发的时候,按照官方的推荐都是使用内嵌的Servlet容器,和应用一起打包成jar包部署,当然,我们可以使用传统war包来部署,Main Class只需继承org.springframework.boot.web.servlet.support.SpringBootServletInitializer即可(启动时会加载所有ServletContainerlnitializer)。

免去web.xml是通过Servlet 3.0中的javax.servlet.ServletContainerInitializer来实现的,ServletContainerInitializer是提供了一个实现和web.xml类似功能的接口,在应用启动的时候能够通过编程的方式来注册Servlet、Fileter、Listener的功能。

SpringBoot通过Servlet3.0的这个设计,结合SPI机制,在spring-web包下发现META-INF/services/javax.servlet.ServletContainerInitializer实现类:org.springframework.web.SpringServletContainerInitializer从而进行初始化,包括对DispatcherServlet的注册,ContextLoaderListener的注册等等,最终免去web.xml

总结

Servlet 3.0之后提供了ServletContainerInitializer接口,通过实现该接口就可以通过代码的形式来实现web.xml的功能,最后注意,实现ServletContainerInitializer的实现了需要注意表明注解@HandlesTypes来指定实现类的参数从而进行定制化注册。

参考:

欢迎关注【Java In Mind】:


qrcode_for_gh_69aef67cad36_258.jpg

相关文章

  • 使用SpringBoot之后web.xml去哪儿了

    web.xml的作用 还记得我们在写Java Web的时候吗,那个时候需要Web工程都需要在WEB-INF下,放置...

  • Spring 应用的多种启动方式

    本文基于:SpringBoot-2.1.4 方式1. Servlet3.0 之前使用 web.xml 配置监听器,...

  • kotlin语法-SpringBoot配置web.xml,Ser

    1.SpringBoot用注解的方式配置web.xml 在web.xml中配置过滤器如下: 对应在SpingBoo...

  • 【哲学微缩景观-6】兴趣去哪儿了?

    时间去哪儿了? 记得此语曾颇为流行。流行之后呢?恐怕“时间”该“去哪儿”还是“去哪儿了”。——老样子吧? 为什么总...

  • 去哪儿了

    今天同事找我应个急接万把块钱,可是我却没钱借给她,她的随口一句你的钱都去哪了?我也好好反思了一下我的钱呢?这几年来...

  • 去哪儿了

    因事冷落了简书十来天,回来循例翻阅友友的文章,结果有好几个都停留在了我上次点赞的文章上。再细辨,发现有的账号都快蒙...

  • web.xml Filter

    转载在web.xml文件中注册了Filter之后,还要在web.xml文件中映射Filter

  • 二、servlet使用注解的方法以及注意点

    1、 在servlet3.0版本之后可以使用,servlet注解的形式,省去配置web.xml;在使用servle...

  • redis笔记-day03

    springboot整合 *在springboot2.x之后,原来使用的jedis被替换成lettuce jedi...

  • 以前的我去哪儿了?去哪儿了?

    《前任3》中孟云和林佳明明心中都有对方就为了争口气,都不肯先开口,错过了最佳挽回时期,最终缘分耗尽,只能分手!悲哀...

网友评论

    本文标题:使用SpringBoot之后web.xml去哪儿了

    本文链接:https://www.haomeiwen.com/subject/iynguctx.html