SpringBoot配置嵌入式Servlet容器
SpringBoot默認使用Tomcat作爲嵌入式的Servlet容器
定製和修改Servlet容器相關配置
可以通過全局配置文件或者自己編寫WebServerFactoryCustomizer來修改Servlet容器的相關配置
全局配置文件
可以在 全局配置文件application.properties修改和server有關的配置
server.port=8081
server.context‐path=/crud
server.tomcat.uri‐encoding=UTF‐8
//通用的Servlet容器設置
server.xxx
//Tomcat的設置
server.tomcat.xxx
原理:ServerProperties
編寫WebServerFactoryCustomizer
在MyMvcConfig中編寫WebServerFactoryCustomizer來修改
這是springboot2.x版本的
//使用WebMvcConfigure
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
@Bean
public WebServerFactoryCustomizer webServerFactoryCustomizer(){
return new WebServerFactoryCustomizer<ConfigurableWebServerFactory>() {
@Override
public void customize(ConfigurableWebServerFactory factory) {
factory.setPort(8083);
}
};
}
}
註冊Servlet三大組件
以前我們可以在web.xml文件中註冊自己的Servlet。
由於SpringBoot默認是以jar包的方式啓動嵌入式的Servlet容器來啓動SpringBoot的web應用,沒有web.xml文件。
下面看一下SpringBoot2.x 如何註冊Servlet 三大組件:
- ServletRegistrationBean 註冊Servlet
- FilterRegistrationBean 註冊Filter
- ServletListenerRegistrationBean 註冊Listener
註冊Servlet
- 編寫自己的servlet
首先我們在 servlet包下寫一個,我們自己的servletpublic class MyServlet extends HttpServlet { //處理get請求 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("Hello MyServlet"); } }
- 在配置文件中註冊
然後在配置文件中使用ServletRegistrationBean 註冊@Configuration public class MyServerConfig { //註冊Servlet @Bean public ServletRegistrationBean myServlet(){ ServletRegistrationBean<HttpServlet> registrationBean = new ServletRegistrationBean<>(new MyServlet(), "/myServlet"); return registrationBean; }
註冊Filter
- 編寫自己的Filter
public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("Filter 執行了"); filterChain.doFilter(servletRequest,servletResponse); } @Override public void destroy() { } }
- 註冊Filter
//註冊Filter @Bean public FilterRegistrationBean myFilter(){ FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>(); filterFilterRegistrationBean.setFilter(new MyFilter()); filterFilterRegistrationBean.setUrlPatterns(Arrays.asList("/hello","/myServlet")); //要攔截的請求 return filterFilterRegistrationBean; }
註冊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項目銷燬"); } }
- 註冊listener
//註冊Listener
@Bean
public ServletListenerRegistrationBean myListener(){
ServletListenerRegistrationBean servletListenerRegistrationBean = new ServletListenerRegistrationBean(new MyListener());
return servletListenerRegistrationBean;
}
SpringBoot註冊DispatcherServlet
SpringBoot幫我們自動SpringMVC的時候,自動的註冊SpringMVC的前端控制器;DIspatcherServlet;
在DispatcherServletAutoConfiguration中
這個DispatcherServletRegistrationBean繼承了ServletRegistrationBean
通過這個源碼我們可以知道可以通過server.servletPath
來修改SpringMVC前端控制器默認攔截的請求路徑
切換嵌入式Servlet容器
SpringBoot支持以下三種嵌入式Servlet容器:
- TomCat 默認
- Jetty
適合開發長連接(比如Web聊天) - Undertow
優點:高性能 非阻塞的Servlet容器 併發性能好
缺點:不支持JSP
要切換 嵌入式Servlet容器,就是排除Tomcat依賴,然後導入要切換的容器的依賴即可。
切換成jetty:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--引入其他的Servlet容器-->
<dependency>
<artifactId>spring-boot-starter-jetty</artifactId>
<groupId>org.springframework.boot</groupId>
</dependency>
切換成undertow
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--引入其他的Servlet容器-->
<dependency>
<artifactId>spring-boot-starter-undertow</artifactId>
<groupId>org.springframework.boot</groupId>
</dependency>