在内嵌Servlet容器下Spring Boot中如何加载Servlet?

本文探讨了在Spring Boot中加载Servlet的方式,包括Servlet3.0新特性、Spring对ServletContainerInitializer的支持以及SpringBoot如何注册Servlet,消除web.xml。通过分析SpringServletContainerInitializer和TomcatStarter,揭示了内嵌容器下Servlet的注册机制。
摘要由CSDN通过智能技术生成

在内嵌Servlet容器下Spring Boot中如何加载Servlet?

0、什么是ServletContext?

在这里插入图片描述
以上是ServletContext源码描述,基本上就是与Servlet容器(例如常用的Tomcat)通信的对象,该对象被ServletConfig对象持有。我们将Servlet注册到Servlet容器中,就是通过该对象实现的。

文章主要内容:
1、传统方法(servlet3.0 以前)
2、servlet3.0新特性 ,提供消除web.xml的特性
3、Spring对Servlet的支持
4、SpringBoot如何加载Servlet,消除web.xml

一、传统方法(servlet3.0 以前)

这里的传统方法,指通过web.xml文件来配置Servlet或Filter的过程,这种方式简单(理解简单,使用简单)粗暴。

基本步骤:
1、写一个Servlet或Filter
2、通过web.xml配置Servlet或Filter的类全路径以及映射处理关系

二、servlet3.0新特性,提供消除web.xml的特性

这些新特性的其中一个重要的目的在于简化 Web 应用的开发和部署。

2.1通过注解简化web开发

新增注解类:@WebServlet,@WebFilter ,@WebListener;这些注解等价于在web.xml文件中添加的相关配置信息,也就是说,不用在web.xml文件中进行配置了。

  • 思考问题:这些被注解的类(servlet 、filter、listener)如何被识别呢?

2.2通过动态加载servlet 、filter、listener简化web开发

servlet3.0 规范还提供了更强大的功能,可以在运行时动态注册 servlet ,filter,listener。
ServletContext 为动态配置 Servlet 增加了如下方法:
新增Servlet:

public ServletRegistration.Dynamic addServlet(String servletName, String className);

新增Filter

public FilterRegistration.Dynamic addFilter(String filterName, String className);

新增Listener

public void addListener(String className);

还有许多重载的方法,可以通过代码的方式(code-based)而不是web.xml的方式(xml-based)来动态注册 servlet ,filter,listener。

  • 思考问题:ServletContext加载servlet ,filter,listener的时机?

2.3Servlet容器启动时通过ServletContext加载Servlet

容器在启动时使用 JAR 服务 API(JAR Service API) 来发现 ServletContainerInitializer 的实现类,并且容器将 WEB-INF/lib 目录下 JAR 包中的类都交给实现类的 onStartup()方法处理,ServletContainerInitializer 是 Servlet 3.0 新增的一个接口。
例如:

public class MyServletContainerInitializer implements ServletContainerInitializer {
   
  private final static String PROCSS_URL= "/hello";
  @Override
  public void onStartup(Set<Class<?>> c, ServletContext servletContext) {
   
  
  //创建 helloWorldServlet...
    ServletRegistration.Dynamic servlet = servletContext.addServlet(
            HelloWorldServlet.class.getSimpleName(),
            HelloWorldServlet.class);
    //对指定URL进行处理
    servlet.addMapping(PROCSS_URL);

  //创建 helloWorldFilter...
    FilterRegistration.Dynamic filter = servletContext.addFilter(
            HelloWorldFilter.class.getSimpleName(), HelloWorldFilter.class);

    EnumSet<DispatcherType> dispatcherTypes = EnumSet.allOf(DispatcherType.class)<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值