在讲Spring之前,我们先来了解下Servelt3.0简单特性,方便后期理解Springmvc、SpringBoot等框架的初始化实现。
对应Servlet3.0的介绍,只做一些简单的介绍,如果需要详细的Servlet3.0的内容,可以查看大神 张开涛的博客–servlet3.0章节内容
servlet3.0特性
异步支持
注解支持
可插拔支持(可以拆分为web.xml 和 web-fragment.xml ),定义不同的servlet,使用web-fragment.xml
插件增强ServletContext ,可以该对象支持在运行时动态部署 Servlet、过滤器、监听器,以及为 Servlet 和过滤器增加 URL 映射等。
Servlet 三大组件
Servlet 、 Listener、Filter
注解支持
注解 | 说明 | web.xml对比 |
---|---|---|
@WebServlet | 定义Servlet | |
@WebListener | 定义listener | ListenerClass |
@WebInitParam | 与Servlet、Listener、Filter配合使用,定义初始化参数 | |
@WebFilter | 定义拦截器 | |
@MultipartConfig | 该注解主要是为了辅助 Servlet 3.0 中 HttpServletRequest 提供的对上传文件的支持。该注解标注在 Servlet 上面,以表示该 Servlet 希望处理的请求的 MIME 类型是 multipart/form-data。另外,它还提供了若干属性用于简化对上传文件的处理 |
@WebServlet
属性 | 类型 | 是否必须 | 说明 |
---|---|---|---|
asyncSupported | boolean | 否 | 指定Servlet是否支持异步操作模式 |
displayName | String | 否 | 指定Servlet显示名称 |
initParams | WebInitParam[] | 否 | 配置初始化参数 |
loadOnStartup | int | 否 | 标记容器是否在应用启动时就加载这个Servlet |
name | String | 否 | 指定Servlet名称 |
urlPatterns/value | String[] | 否 | 这两个属性作用相同,指定Servlet处理的url |
@WebListener
属性 | 类型 | 是否必须 | 说明 |
---|---|---|---|
value | String | 否 | 知道listener 对应的class |
@WebFilter
属性 | 类型 | 是否必需 | 说明 |
---|---|---|---|
asyncSupported | boolean | 否 | 指定Filter是否支持异步模式 |
dispatcherTypes | DispatcherType[] | 否 | 指定Filter对哪种方式的请求进行过滤。 支持的属性:ASYNC、ERROR、FORWARD、INCLUDE、REQUEST; 默认过滤所有方式的请求 |
filterName | String | 否 | Filter名称 |
initParams | WebInitParam[] | 否 | 配置参数 |
displayName | String | 否 | Filter显示名 |
servletNames | String[] | 否 | 指定对哪些Servlet进行过滤 |
urlPatterns/value | String[] | 否 | 两个属性作用相同,指定拦截的路径 |
增强ServletContext插件
在servlet3.0中,运行在容器运行中,动态添加Servlet、过滤器、监听器。称为编程式添加和配置
ServletContext插件原理
Demo
//HandlesTypes 可以指定所有类型的的实现类,这些实现类会被注入到onStartup 的第一个参数 set中
@HandlesTypes(value = MyService.class)
public class MyServletContainerInitializer implements ServletContainerInitializer{
/**
* tomcat启动时加载应用的时候,会运行onStartup方法;
*
* Set<Class<?>> arg0:感兴趣的类型的所有子类型(对实现了JamesService接口相关的);
* ServletContext arg1:代表当前Web应用的ServletContext;一个Web应用一个ServletContext;
*
* 1)、使用ServletContext注册Web组件(Servlet、Filter、Listener)
* 2)、使用编码的方式,在项目启动的时候给ServletContext里面添加组件;
* 必须在项目启动的时候来添加;
* 1)、ServletContainerInitializer得到的ServletContext;
* 2)、ServletContextListener得到的ServletContext;
*/
@Override
public void onStartup(Set<Class<?>> set, ServletContext servletContext) throws ServletException {
for (Class s : set){
//会打印出所有的实现类,包括抽象类
System.out.println(s);//当传进来后,可以根据自己需要利用反射来创建对象等操作
}
}
}