一、前言
springboot中默认使用的是tomcat容器,也叫做嵌入式的servlet容器。因为它和我们平常使用的tomcat容器不一样,这个tomcat直接嵌入到的springboot,平常我们使用tomcat容器是一个独立的应用,配置的时候需要在tomcat中的xml中配置,而使用springboot就不一样了,本文我们来学习怎么配置和替换servlet容器、以及注册传统的servlet组件。
二、自定义Servlet容器的相关配置
2.1 修改配置文件的值
我们可以在application.properties中按照传统的配置方式设置,如下:
server.port=8081server.context-path=/crudserver.tomcat.uri-encoding=UTF-8//通用的Servlet容器设置server.xxx//Tomcat的设置server.tomcat.xxx
其中server开头的是web容器统一的配置,因为我们以后可以使用其他的web容器,带tomcat的是特定为tomcat容器的配置。
2.2 编码方式配置
1 package com.example.demo.config; 2 3 import org.springframework.boot.web.server.ConfigurableWebServerFactory; 4 import org.springframework.boot.web.server.WebServerFactoryCustomizer; 5 import org.springframework.context.annotation.Bean; 6 import org.springframework.context.annotation.Configuration; 7 8 9 @Configuration10 public class MyServerConfig {11 12 @Bean13 public WebServerFactoryCustomizer embeddedServletContainerCustomizer(){14 return new WebServerFactoryCustomizer<ConfigurableWebServerFactory>() {15 @Override16 public void customize(ConfigurableWebServerFactory factory) {17 factory.setPort(8085);18 }19 };20 }21 }
启动之后我们就把端口设置到了8085。
三、
1 @Bean2 public ServletRegistrationBean myServlet(){3 ServletRegistrationBean registrationBean = new ServletRegistrationBean(new MyServlet(),'/myServlet');4 return registrationBean;5 }
1 public class MyServlet extends HttpServlet {2 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {3 response.getWriter().write('hello,my servlet');4 }5 6 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {7 this.doPost(request, response);8 }9 }
启动后浏览器访问http://localhost:8085/myServlet,被我们的MyServlet接管处理,因为配置的时候我们要处理的urlPatterns是/myServlet。
3.2 注册Filter
一样的原理,我们使用FilterRegistrationBean类来往容器中添加Filter组件:
1 @Bean2 public FilterRegistrationBean myFilter(){3 FilterRegistrationBean registrationBean = new FilterRegistrationBean();4 registrationBean.setFilter(new MyFilter());5 registrationBean.setUrlPatterns(Arrays.asList('/hello','/myServlet'));6 return registrationBean;7 }
添加一个MyFilter的类来处理映射的url:
1 @WebFilter(filterName = 'MyFilter') 2 public class MyFilter implements Filter { 3 public void destroy() { 4 } 5 6 public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { 7 resp.getWriter().write('hello,my filter'); 8 chain.doFilter(req, resp); 9 }10 11 public void init(FilterConfig config) throws ServletException {12 13 }14 15 }
3.3 注册Listener
使用ServletListenerRegistrationBean类来往容器中添加Listener组件:
1 @Bean2 public ServletListenerRegistrationBean myListener(){3 ServletListenerRegistrationBean<MyListener> registrationBean = new ServletListenerRegistrationBean<>(new MyListener());4 return registrationBean;5 }
添加一个MyListenner的类来处理逻辑:
1 public class MyListener implements ServletContextListener { 2 @Override 3 public void contextInitialized(ServletContextEvent sce) { 4 System.out.println('contextInitialized...web应用启动'); 5 } 6 7 @Override 8 public void contextDestroyed(ServletContextEvent sce) { 9 System.out.println('contextDestroyed...当前web项目销毁');10 }11 }
这就是我们注册传统三大组件的方法。
有了以上的基础,我们就可以看一下,其实springboot为我们启动springmvc的时候也是通过这种方式注册了DispatcherServlet,这就是我们springmvc中核心的servlet。
1 @Bean(name = DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME) 2 @ConditionalOnBean(value = DispatcherServlet.class, name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME) 3 public ServletRegistrationBean dispatcherServletRegistration( 4 DispatcherServlet dispatcherServlet) { 5 ServletRegistrationBean registration = new ServletRegistrationBean( 6 dispatcherServlet, this.serverProperties.getServletMapping()); 7 //默认拦截: / 所有请求;包静态资源,但是不拦截jsp请求; /*会拦截jsp 8 //可以通过server.servletPath来修改SpringMVC前端控制器默认拦截的请求路径 9 10 registration.setName(DEFAULT_DISPATCHER_SERVLET_BEAN_NAME);11 registration.setLoadOnStartup(12 this.webMvcProperties.getServlet().getLoadOnStartup());13 if (this.multipartConfig != null) {14 registration.setMultipartConfig(this.multipartConfig);15 }16 return registration;17 }
四、总结
这次我们学些了怎样注册传统的三大组件,虽然用到的机会可能不会那么多了,但是springboot的设计理念还是很好的。