一、问题的焦点是什么?
- SpringWebMVC提供的DispathcerServlet的类中,并没有@WebServlet的注解
- javaweb3.0之前,可以使用web.xml加以注册使用
- 但是3.0+,。。。
二、web 容器提供的新类
- 名字:
javax.servlet.ServletContainerInitializer
- 作用:主要用于在容器启动阶段通过编程风格注册Filter, Servlet以及Listener,以取代通过web.xml配置注册。
- 使用方式如下:
@HandlesTypes(MyBean.class)//自定义类的子类(只能扫描到子类)
public class MyWebAppInitializer implements ServletContainerInitializer {
@Override
public void onStartup(Set<Class<?>> myBeanClazzes//自定义的类,将被扫描出来
, ServletContext ctx) throws ServletException {
//添加及配置JavaWeb的三大组件
ctx.addServlet("servlet-name", HttpServlet.class);
// .setLoadOnStartup(1)
// .addMapping("/")
// .setInitParameter("","")
// ctx.addFilter();
// ctx.addListener();
}
}
- 让容器找到它
建立文件,名字:
/META-INF/services/javax.servlet.ServletContainerInitializer
。
文件内容:cn.johnyu.MyWebAppInitializer
- 此时,它将随着容器启动,并回调onStartup方法
三、Spring的实现方案:
- 提供了自定义的ContainerInitailizer:
@HandlesTypes({WebApplicationInitializer.class})
public class SpringServletContainerInitializer implements ServletContainerInitializer {
//...
}
- 在其中调用了WebApplicationInitializer的方法
while(var4.hasNext()) {
WebApplicationInitializer initializer = (WebApplicationInitializer)var4.next();
initializer.onStartup(servletContext);
}
- 你需要的只是继承WebApplicationInitializer
- 问题可以更简单,Spring提供了一个默认的实现
AbstractAnnotationConfigDispatcherServletInitializer
,你需要的只是实现它的两个方法
public class MySpringIntializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{RootConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{WebConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。