在内嵌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)<