Spring Boot-嵌入式Servlet容器&三大組件

這篇博客,只是簡述如何去使用, 不會有太深的分析 , 我以爲一個東西要先會用再去學習底層原理,會更加的順暢一點。前端

配置

Spring Boot默認是使用Tomcat做爲嵌入式的Servlet容器;java

1.如何定製和修改Servlet容器的相關配置?

1) 修改propertis/yml配置文件:web

  • 示例
server.port=8080
server.tomcat.uri-encoding=UTF-8
...
...
複製代碼

2) 代碼實現方式spring

package com.carson.springboot.config;

import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyServerConfig {

    // 配置servlet容器
    @Bean
    public ConfigurableServletWebServerFactory configurableServletWebServerFactory(){
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        factory.setPort(8080);
        return factory;
    }

}

複製代碼

2. 註冊 Servlet,Filter,Listener 三大組件

  • Servlet 代碼示例:

建立一個類 MyServlet 繼承 HttpServlet數組

package com.carson.springboot.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

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

複製代碼
  • 再從剛纔的 MyServerConfig 類 添加一個方法
// 註冊三大組建的 Servlet
    @Bean 
    public ServletRegistrationBean myServlet(){
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(new MyServlet(),"/myServlet");
        // MyServlet 就是剛纔寫的類
        return registrationBean;
    }
複製代碼

參數說明: new ServletRegistrationBean(傳入哪個Servlet,攔截哪一個路徑)tomcat

校驗是否生效: 訪問 /myServlet 查看效果springboot

能夠看到輸出的 字符串內容,說明生效了ide

  • Filter 代碼示例

package com.carson.springboot.filter;

import javax.servlet.*;
import java.io.IOException;

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 RUN!!!!");
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override // 銷燬
    public void destroy() {

    }
}

複製代碼

也是建立一個本身的filter類,實現Filter接口,注意是 import javax.servlet.*;包下的Filterspring-boot

初始化和銷燬就先不寫了,只寫運行中時候學習

  • 再次來到剛纔的 MyServerConfig 類

加上如下代碼

// 2.註冊 Filter
    @Bean
    public FilterRegistrationBean myFilter(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        // 設置一個 Filter 也就是我剛纔自定義的 類
        filterRegistrationBean.setFilter(new MyFilter());
        // 設置 攔截路徑(可多個)
        filterRegistrationBean.setUrlPatterns(Arrays.asList("/hello","/myServlet"));
        return filterRegistrationBean;
    }
複製代碼

setUrlPatterns默認須要傳入一個集合,我轉成了數組

試驗一下:

訪問 http://localhost:8080/hello或者http://localhost:8080/myServlet:

查看idea控制檯👇

打印出了 MyFilter RUN!!!! 說明剛纔的 doFilter 執行了!

  • Listener

編寫一個MyListener類:

package com.carson.springboot.listener;

import javax.servlet.Servlet;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

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項目銷燬");
    }
}

複製代碼

註冊一下(這裏依然是剛纔的 MyServerConfig 類):

// 3.註冊 listener
    @Bean
    public ServletListenerRegistrationBean servletListenerRegistrationBean(){
        ServletListenerRegistrationBean mylistener = new ServletListenerRegistrationBean(new MyListener());
        return mylistener;
    }
複製代碼

試驗:

  1. 啓動 項目

咱們看到了 啓動

咱們再試一下銷燬

注意!!! : 這裏的銷燬 不能夠 直接按:

按這個裏就看不到銷燬字符串了

應該按 這裏:

看到銷燬表示個人 listener 正常執行了


Spring Boot 底層幫咱們自動配置SpringMVC的時候,也幫咱們配置了 前端控制器 DispatcherServlet

基本的配置原理也和三大組件差不太多,這裏就很少贅述了


如何使用其餘Servlet容器?

Spring Boot 除了 Tomcat(默認的) 之外 還支持:

  • Jetty (適合長時間鏈接)
  • Undertow (不支持JSP)

這兩個容器

要想使用 其餘的容器,就須要先把 tomcat 給除掉!

pom.xml 文件下 ctrl+alt+shift+u 打開依賴網

或者鼠標右鍵 👇

排除方法

而後添加 jetty的依賴:

<!-- 引入其餘的servlet容器-->
        <dependency>
            <artifactId>spring-boot-starter-jetty</artifactId>
            <groupId>org.springframework.boot</groupId>
        </dependency>
複製代碼

修改剛纔的 MyServerConfig 類中的代碼:

// 配置servlet容器
    @Bean
    public ConfigurableServletWebServerFactory configurableServletWebServerFactory(){
        //TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        JettyServletWebServerFactory jettyServletWebServerFactory = new JettyServletWebServerFactory();
        jettyServletWebServerFactory.setPort(9192);
       // factory.setPort(8080);
        return jettyServletWebServerFactory;
    }
複製代碼

從名稱上能夠看出來 一個是 tomcat 一個是 jetty

運行程序:

我發現 端口號是我剛纔設置的端口,而且 三大組件 還在生效

就算是切換Undertow 也是同樣的流程,這裏我就寫一下代碼看一下,就再也不來一遍了:

UndertowServletWebServerFactory undertowServletWebServerFactory = new UndertowServletWebServerFactory();
        undertowServletWebServerFactory.setPort(8080);
複製代碼

切換其餘容器就寫完了,我這邊要再換回 tomcat 以防止出什麼問題,畢竟我一開始就是以Tomcat爲基礎寫的程序

相關文章
相關標籤/搜索