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>