Servlet3.0
ServletContainerInitializer
shared libraies (共享库) /runtimes pluggability(运行时插件能力)
- servlet 容器启动会扫描 当前应用里面的没一个jar 包、
servletContainerInitializer的实现
-
提供ServletContainerInitializer的实现类
绑定在META-inf/services/javax.servlet.ServletContainerInitializer
内容就是ServletContainerInitializer实现类的全类名
总结:容器在启动的时候 会扫描当前的每一个jar 里面
META-INF/services/javax.servlet.ServletContainerInitializer
指定实现类 ,并且启动运行这个类的实现方法
META-INF/services/javax.servlet.ServletContainerInitializer里面内容 自定义myServletContainerInitializer的全类名
com.huliyong.servlet.myServletContainerInitializer
/**
* 容器启动的时候会把@HandlesTypes指定的类型下面的子类(实现类,接口)传送过来
*/
@HandlesTypes(value = {HelloService.class})
public class myServletContainerInitializer implements ServletContainerInitializer {
/**
*
* 应用启动的时候运行
* @param set 感兴趣的所有类型的后代类型
* @param servletContext 当前web应用的servletContext
* @throws ServletException
*/
@Override
public void onStartup(Set<Class<?>> set, ServletContext servletContext) throws ServletException {
System.out.println("感兴趣的类型");
System.out.println("-----------------------------------");
set.forEach(System.out::println);
}
}
servletContext 注册三大组件(servlet,Filter,Listener)
*使用servletContext 注册web组件(servlet Filter listener )
使用编码的格式,在项目启动的时候给servletContext 里面添加组件
* 必须在项目启动的时候添加
* 1。 servletContainerInitializer得到的servletContext 对象
* 2. Listener 中 ServletContextEvent 得到组件 ServletContext servletContext = sce.getServletContext();
*/
/**
* 容器启动的时候会把@HandlesTypes指定的类型下面的子类(实现类,接口)传送过来
*/
@HandlesTypes(value = {
HelloService.class})
public class myServletContainerInitializer implements ServletContainerInitializer {
/**
*
* 应用启动的时候运行
* @param set 感兴趣的所有类型的后代类型
* @param sc 当前web应用的servletContext
* @throws ServletException
*
*使用servletContext 注册web组件(servlet Filter listener )
使用编码的格式,在项目启动的时候给servletContext 里面添加组件
* 必须在项目启动的时候添加
* 1。 servletContainerInitializer得到的servletContext 对象
* 2. Listener 中 ServletContextEvent 得到组件 ServletContext servletContext = sce.getServletContext();
*/
@Override
public void onStartup(Set<Class<?>> set, ServletContext sc) throws ServletException {
System.out.println("感兴趣的类型");
System.out.println("-----------------------------------");
set.forEach(System.out::println);
//注册组件
ServletRegistration.Dynamic userServlet = sc.addServlet("UserServlet", UserServlet.class);
//配置映射信息
userServlet.addMapping("/user");
//注册组件Listener
sc.addListener(UserListener.class);
//注册组件Filter
FilterRegistration.Dynamic userFilter = sc.addFilter("userFilter", new UserFilter());
userFilter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST),true,"/*");
}
}
Servlet3.0与SpringMVC 进行整合
容器在启动的时候 会扫描当前的每一个jar 里面
META-INF/services/javax.servlet.ServletContainerInitializer
加载这个文件的指定类XXXServletContainerInitializer
Spring的应用在启动的时候会加载(感兴趣)WebApplicationInitializer接口下的组件
并且为WebApplicationInitializer组件创建对象(组件不是接口,不是抽象类 )
-
AbstractContextLoaderInitializer: createRootApplicationContext()
-
AbstractDispatcherServletInitializer:
1. 创建一个web 容器 servletAppContext createServletApplicationContext()、 2. 创建一个 dispatcherServlet createDispatcherServlet() 3. 创建的dispatcherServlet 添加到servletAppContext 里面
3.AbstractAnnotationConfigDispatcherServletInitializer
注解方式进行配置dispatcherServlet 初始器
1. 创建根容器createRootApplicationContext()
2 创建web的ioc 容器:createServletApplicationContext()
-
总结:以注解方法来启动SpringMVC 继承AbstractAnnotationConfigDispatcherServletInitializer
实现里面的抽象方法指定DispatcherServlet的配置信息
[
如图 希望我们 RootWeb。。。 对业务逻辑等组件进行扫描
servletWeb ... 对页面的组件进行扫描
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
无xml 下要加上这个
必须导入servlet-api 并且<scope>provided</scope>
<dependency>
<groupId>javax.