【Spring Boot】配置嵌入式Servlet容器

SpringBoot默认使用Tomcat作为嵌入式的Servlet容器

在这里插入图片描述

定制和修改Servlet容器相关配置

可以通过全局配置文件或者自己编写WebServerFactoryCustomizer来修改Servlet容器的相关配置

全局配置文件

可以在 全局配置文件application.properties修改和server有关的配置

server.port=8081
server.context‐path=/crud
server.tomcat.uri‐encoding=UTF8
//通用的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

  1. 编写自己的servlet
    首先我们在 servlet包下写一个,我们自己的servlet
    public 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");
        }
    }
    
    

  2. 在配置文件中注册
    然后在配置文件中使用ServletRegistrationBean 注册
    @Configuration
    public class MyServerConfig {
         
          
    
    
        //注册Servlet
        @Bean
        public ServletRegistrationBean myServlet(){
         
          
    
            ServletRegistrationBean<HttpServlet> registrationBean = new ServletRegistrationBean<>(new MyServlet(), "/myServlet");
            return registrationBean;
        }
    

注册Filter

  1. 编写自己的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() {
         
         
    
        }
    }
    
    
  2. 注册Filter
        //注册Filter
        @Bean
        public FilterRegistrationBean myFilter(){
         
         
            FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>();
            filterFilterRegistrationBean.setFilter(new MyFilter());
            filterFilterRegistrationBean.setUrlPatterns(Arrays.asList("/hello","/myServlet")); //要拦截的请求
            return filterFilterRegistrationBean;
        }
    

注册Listener

  1. 编写自己的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项目销毁");
        }
    }
    
    
  2. 注册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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章