springBoot12_WEB开发07_springBoot2.x定制和修改servlet容器的相关配置、注册servlet三大组件、切换其他嵌入式servlet容器、使用外置servlet容器

我们以前的web项目,首先需要打成war包,在外部配置好tomcat环境,这个tomcat就是servlet容器
把war包部署到tomcat上,然后启动tomcat

而springBoot是直接启动的,使用的是内部自带的tomcat,即嵌入式的servlet容器
那么内嵌的tomcat配置如何修改?
支持其他servlet容器吗?

springBoot2.x定制和修改servlet容器的相关配置

1、修改server有关配置ServerProperties

server.port=8081
server.context-path=/crud

server.tomcat.uri-encoding=UTF-8

//通用的Servlet容器设置
server.xxx
//Tomcat的设置
server.tomcat.xxx

2、编写WebServerFactoryCustomizer:嵌入式的Servlet容器的定制器;来修改Servlet容器的配置

@Configuration
public class MyMvcConfig implements WebMvcConfigurer {

    @Bean  //将定制器加入到容器中
    public WebServerFactoryCustomizer<ConfigurableWebServerFactory> webServerFactoryCustomizer(){
        return new WebServerFactoryCustomizer<ConfigurableWebServerFactory>() {
            //定制嵌入式的servlet容器相关规则
            @Override
            public void customize(ConfigurableWebServerFactory factory) {
                factory.setPort(8082);
            }
        };
    }

注意

1)、SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(@Bean、@Component)如果有就用用户配置的,如果没有,才自动配置;如果有些组件可以有多个(ViewResolver)将用户配置的和自己默认的组合起来;

​2)、在SpringBoot中会有非常多的xxxConfigurer帮助我们进行扩展配置

​3)、在SpringBoot中会有很多的xxxCustomizer帮助我们进行定制配置

注册servlet三大组件:Servlet、Filter、Listener

以前我们的web应用,src下有webapp/WEB-INF/web.xml
我们在web.xml下可以注册三大组件
由于SpringBoot默认是以jar包的方式启动嵌入式的Servlet容器来启动SpringBoot的web应用,没有web.xml文件。
现在是springBoot 项目,使用以下方式注册

在这里插入图片描述
注册

@Configuration
public class MyServerConfig {

    //注册三大组件
    @Bean
    public ServletRegistrationBean myServlet(){
        ServletRegistrationBean servletRegistrationBean =
                new ServletRegistrationBean(new MyServlet(), "/myServlet");
        servletRegistrationBean.setLoadOnStartup(1);
        return servletRegistrationBean;
    }

    @Bean
    public FilterRegistrationBean myFilter(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new MyFilter());
        filterRegistrationBean.setUrlPatterns(Arrays.asList("/hello", "/myServlet"));
        return filterRegistrationBean;
    }

    @Bean
    public ServletListenerRegistrationBean myListener(){
        ServletListenerRegistrationBean<MyListener> listenerRegistrationBean =
                new ServletListenerRegistrationBean<>(new MyListener());
        return listenerRegistrationBean;
    }

定义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");
    }
}

定义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("myFilter process...");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

定义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项目销毁");
    }
}

SpringBoot帮我们自动配置SpringMVC的时候,自动的注册SpringMVC的前端控制器;DIspatcherServlet;

springBoot12_WEB开发07_springBoot2.x定制和修改servlet容器的相关配置、注册servlet三大组件、切换其他嵌入式servlet容器、使用外置servlet容器_第1张图片

切换其他嵌入式servlet容器

Jetty适用于长连接应用,比如web聊天,那么就不适合用tomcat,jetty保证长时间的架起连接
undertow是不支持jsp的,但是并发性能好

选中ConfigurableWebServerFactory, 按下Ctrl + H 打开继承树
发现可配置的嵌入式容器
springBoot12_WEB开发07_springBoot2.x定制和修改servlet容器的相关配置、注册servlet三大组件、切换其他嵌入式servlet容器、使用外置servlet容器_第2张图片
默认就是tomcat

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
   引入web模块默认就是使用嵌入式的Tomcat作为Servlet容器;
</dependency>

先把tomcat排除
springBoot12_WEB开发07_springBoot2.x定制和修改servlet容器的相关配置、注册servlet三大组件、切换其他嵌入式servlet容器、使用外置servlet容器_第3张图片
换成jetty

<!-- 引入web模块 -->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
   <exclusions>
      <exclusion>
         <artifactId>spring-boot-starter-tomcat</artifactId>
         <groupId>org.springframework.boot</groupId>
      </exclusion>
   </exclusions>
</dependency>

<!--引入其他的Servlet容器-->
<dependency>
   <artifactId>spring-boot-starter-jetty</artifactId>
   <groupId>org.springframework.boot</groupId>
</dependency>

在这里插入图片描述
切换undertow也是一样

<!-- 引入web模块 -->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
   <exclusions>
      <exclusion>
         <artifactId>spring-boot-starter-tomcat</artifactId>
         <groupId>org.springframework.boot</groupId>
      </exclusion>
   </exclusions>
</dependency>

<!--引入其他的Servlet容器-->
<dependency>
   <artifactId>spring-boot-starter-undertow</artifactId>
   <groupId>org.springframework.boot</groupId>
</dependency>

嵌入式Servlet容器自动配置原理??

springBoot12_WEB开发07_springBoot2.x定制和修改servlet容器的相关配置、注册servlet三大组件、切换其他嵌入式servlet容器、使用外置servlet容器_第4张图片

嵌入式servlet容器启动原理??P49

https://www.cnblogs.com/jatpeo/p/11767501.html

使用外置servlet容器

springBoot12_WEB开发07_springBoot2.x定制和修改servlet容器的相关配置、注册servlet三大组件、切换其他嵌入式servlet容器、使用外置servlet容器_第5张图片
我们很多应用都是要开发jsp的,所以需要支持jsp,使用外置servlet容器,打成war包
springBoot12_WEB开发07_springBoot2.x定制和修改servlet容器的相关配置、注册servlet三大组件、切换其他嵌入式servlet容器、使用外置servlet容器_第6张图片
默认是没有webapp目录
可以手动创建,也可以自动生成
springBoot12_WEB开发07_springBoot2.x定制和修改servlet容器的相关配置、注册servlet三大组件、切换其他嵌入式servlet容器、使用外置servlet容器_第7张图片
创建文件夹
springBoot12_WEB开发07_springBoot2.x定制和修改servlet容器的相关配置、注册servlet三大组件、切换其他嵌入式servlet容器、使用外置servlet容器_第8张图片
生成web.xml文件
springBoot12_WEB开发07_springBoot2.x定制和修改servlet容器的相关配置、注册servlet三大组件、切换其他嵌入式servlet容器、使用外置servlet容器_第9张图片
springBoot12_WEB开发07_springBoot2.x定制和修改servlet容器的相关配置、注册servlet三大组件、切换其他嵌入式servlet容器、使用外置servlet容器_第10张图片

启动web应用

整合服务器到idea
编辑配置
springBoot12_WEB开发07_springBoot2.x定制和修改servlet容器的相关配置、注册servlet三大组件、切换其他嵌入式servlet容器、使用外置servlet容器_第11张图片
springBoot12_WEB开发07_springBoot2.x定制和修改servlet容器的相关配置、注册servlet三大组件、切换其他嵌入式servlet容器、使用外置servlet容器_第12张图片
springBoot12_WEB开发07_springBoot2.x定制和修改servlet容器的相关配置、注册servlet三大组件、切换其他嵌入式servlet容器、使用外置servlet容器_第13张图片
新建一个jsp页面
springBoot12_WEB开发07_springBoot2.x定制和修改servlet容器的相关配置、注册servlet三大组件、切换其他嵌入式servlet容器、使用外置servlet容器_第14张图片
部署好项目,运行
在这里插入图片描述

springBoot12_WEB开发07_springBoot2.x定制和修改servlet容器的相关配置、注册servlet三大组件、切换其他嵌入式servlet容器、使用外置servlet容器_第15张图片
springBoot12_WEB开发07_springBoot2.x定制和修改servlet容器的相关配置、注册servlet三大组件、切换其他嵌入式servlet容器、使用外置servlet容器_第16张图片
springBoot12_WEB开发07_springBoot2.x定制和修改servlet容器的相关配置、注册servlet三大组件、切换其他嵌入式servlet容器、使用外置servlet容器_第17张图片
配置springMVC的视图解析器
springBoot12_WEB开发07_springBoot2.x定制和修改servlet容器的相关配置、注册servlet三大组件、切换其他嵌入式servlet容器、使用外置servlet容器_第18张图片
在这里插入图片描述

步骤总结:

springBoot12_WEB开发07_springBoot2.x定制和修改servlet容器的相关配置、注册servlet三大组件、切换其他嵌入式servlet容器、使用外置servlet容器_第19张图片
之后启动服务器使用

原理

springBoot12_WEB开发07_springBoot2.x定制和修改servlet容器的相关配置、注册servlet三大组件、切换其他嵌入式servlet容器、使用外置servlet容器_第20张图片
springBoot12_WEB开发07_springBoot2.x定制和修改servlet容器的相关配置、注册servlet三大组件、切换其他嵌入式servlet容器、使用外置servlet容器_第21张图片
7)、Spring的应用就启动并且创建IOC容器
启动Servlet容器,再启动SpringBoot应用

你可能感兴趣的:(springBoot)