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

web.xml的作用

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

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/j2eehttp://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

DEMO

CharacterEncodingFilter

web.filter.CharacterEncodingFilter

CharacterEncodingFilter

/*

OrderServlet

web.client.OrderServlet

OrderServlet

/servlet/OrderServlet

index.jsp

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实现的:

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/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

id="WebApp_ID" version="3.0">

Spring MVC App

characterEncodingFilter

org.springframework.web.filter.CharacterEncodingFilter

encoding

UTF-8

forceEncoding

true

characterEncodingFilter

/*

SpringController

org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

/WEB-INF/spring-mvc.xml

1

SpringController

/

这个阶段,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来指定实现类的参数从而进行定制化注册。

参考:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值