由于Spring Boot默认是以jar
包的方式启动嵌入式的Servlet容器从而启动web
应用的,因此没有web.xml
文件。
如果需要注册Spring Boot三大组件(Servlet
、Filter
、Listener
)就必须依赖于Spring Boot为我们提供的对应的配置类。
- ServletRegistrationBean Servlet注册Bean
- FilterRegistrationBean Filter注册Bean
- ServletListenerRegistrationBean Listener注册Bean
注册Servlet
// 创建自定义MyServlet类,实现定制的Servlet功能
public class MyServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws Exception {
// 定制返回消息
resp.getWriter().write("Spring Boot, Hello MyServlet...");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Exception {
// get请求直接转发到post
doPost(req, resp);
}
}
// 创建配置类,注入ServletRegistrationBean
@Configuration
public class MyServerConfiguration {
@Bean // 必须注入到容器才能生效
public ServletRegistrationBean myServlet(){
// 引入自定义Servlet,并绑定请求映射uri
return new ServletRegistrationBean(new MyServlet(), "/helloMyServlet");
}
}
注册Filter
// 创建自定义的Filter类,实现自定义过滤功能
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
System.out.println("Spring Boot, Hello MyFilter...");
// 处理完成后,继续向下执行
filterChain.doFilter(servletRequest, servletResponse);
}
}
// 创建配置类,注入FilterRegistrantionBean
@Configuration
public class MyServerConfiguration {
@Bean // 必须注入到容器才能生效
public FilterRegistrationBean myFiler(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
// 引入自定义Filter
filterRegistrationBean.setFilter(new MyFilter());
// 指明要拦截过滤的请求
filterRegistrationBean.setUrlPatterns(Arrays.asList("/myFilter", "/helloMyFilter"));
return filterRegistrationBean;
}
}
注册Listener
// 创建自定义的Listener类,实现自定义监听功能
public class MyListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("contextInitialized... WEB应用启动了!");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("contextDestroyed... 当前WEB应用销毁了!");
}
}
// 创建配置类,注入ServletListenerRegistrationBean
@Configuration
public class MyServerConfiguration {
@Bean
public ServletListenerRegistrationBean myListener(){
ServletListenerRegistrationBean<MyListener> listener =
new ServletListenerRegistrationBean<>(new MyListener());
return listener;
}
}
Spring Boot帮我们自动配置SpringMVC的时候,也自动的注册SpringMVC的前端控制器DIspatcherServlet
。
@ConditionalOnClass({DispatcherServlet.class})
@AutoConfigureAfter({ServletWebServerFactoryAutoConfiguration.class})
public class DispatcherServletAutoConfiguration {
@Bean(name = DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME)
@ConditionalOnBean(value = DispatcherServlet.class,
name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
public ServletRegistrationBean dispatcherServletRegistration(
DispatcherServlet dispatcherServlet) {
ServletRegistrationBean registration = new ServletRegistrationBean(
dispatcherServlet, this.serverProperties.getServletMapping());
// 默认拦截 / 所有请求,包静态资源,但是不拦截jsp请求 /* 拦截所有请求,包括jsp
// 可以通过server.servletPath来修改SpringMVC前端控制器默认拦截的请求路径
registration.setName(DEFAULT_DISPATCHER_SERVLET_BEAN_NAME);
registration.setLoadOnStartup(this.webMvcProperties.getServlet().getLoadOnStartup());
if (this.multipartConfig != null) {
registration.setMultipartConfig(this.multipartConfig);
}
return registration;
}
}