由于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 {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws Exception {// 定制返回消息resp.getWriter().write("Spring Boot, Hello MyServlet...");}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Exception {// get请求直接转发到postdoPost(req, resp);}}// 创建配置类,注入ServletRegistrationBean@Configurationpublic class MyServerConfiguration {@Bean // 必须注入到容器才能生效public ServletRegistrationBean myServlet(){// 引入自定义Servlet,并绑定请求映射urireturn new ServletRegistrationBean(new MyServlet(), "/helloMyServlet");}}
注册Filter
// 创建自定义的Filter类,实现自定义过滤功能public class MyFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,FilterChain filterChain) throws IOException, ServletException {System.out.println("Spring Boot, Hello MyFilter...");// 处理完成后,继续向下执行filterChain.doFilter(servletRequest, servletResponse);}}// 创建配置类,注入FilterRegistrantionBean@Configurationpublic class MyServerConfiguration {@Bean // 必须注入到容器才能生效public FilterRegistrationBean myFiler(){FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();// 引入自定义FilterfilterRegistrationBean.setFilter(new MyFilter());// 指明要拦截过滤的请求filterRegistrationBean.setUrlPatterns(Arrays.asList("/myFilter", "/helloMyFilter"));return filterRegistrationBean;}}
注册Listener
// 创建自定义的Listener类,实现自定义监听功能public class MyListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println("contextInitialized... WEB应用启动了!");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {System.out.println("contextDestroyed... 当前WEB应用销毁了!");}}// 创建配置类,注入ServletListenerRegistrationBean@Configurationpublic class MyServerConfiguration {@Beanpublic 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;}}
