1. 程式人生 > >Web 專案 tiger 之12 註冊 Servlet 三大元件之 Servlet

Web 專案 tiger 之12 註冊 Servlet 三大元件之 Servlet

本文導讀

  • Spring Boot 由於預設以 Jar 包方式啟動嵌入式的 Servlet 容器來啟動 Spring Boot 的 web 應用,沒有 web.xml 檔案,所以無法再像以前一樣通過在 web.xml 配置來使用 Servlet ,但是 Spring Boot 提供了其它的方式。
  • 以前使用 Servlet ,第一步自定義類繼承 javax.servlet.http.HttpServlet,然後重寫其 doGet 與 doPost 方法,在方法中編寫控制程式碼;第二步在 web.xml 中配置<servlet></servlet> 請求對映路徑即可。
  • Spring Boot 註冊 Servlet:
  1. 第一步自定義類繼承 HttpServlet ,然後重寫其 doGet 與 doPost 方法,在方法中編寫控制程式碼仍然需要
  2. 第二步將 ServletRegistrationBean 元件新增到 Spring 容器中

自定義 Servlet

  • 如下所示,仍然和以前一樣書寫 Servlet 程式碼

package com.lct.servlet;

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

/**
 * Created by Administrator on 2018/8/11 0011.
 * 標準的 Servlet 實現 HttpServlet;
 * 重新其 doGet 、doPost 方法
 */
public class BookServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println(":com.lct.servlet.BookServlet:" + req.getRequestURL());
        /**講求轉發到後臺的 user/users 請求去,即會進入*/
        req.getRequestDispatcher("user/users").forward(req, resp);
    }
}
  • 上面 Serlvet 就是轉發到下面的 UserControllr 控制器中,這是以前寫好的,在此不再累述

新增 ServletRegistrationBean

  • @Configuration 配置類相當於以前的 beans.xml 中的配置,也是 tiger 專案之前寫好的,現在將 ServletRegistrationBean 也新增到 Spring 容器中來

package com.lct.config;

import com.lct.component.MyLocaleResolve;
import com.lct.servlet.BookServlet;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;

/**
 * Created by Administrator on 2018/7/28 0028.
 * 自定義配置類
 */
@Configuration
public class MyMvcConfig {

    /**
     * 將我們自己的 LocaleResolver 元件交於 Spring 容器管理
     * 從而覆蓋 Spring Boot預設的區域資訊解析器
     *
     * @return
     */
    @Bean
    public LocaleResolver localeResolver() {
        return new MyLocaleResolve();
    }

    /**
     * 自定義嵌入式Servlet容器定製器元件
     * 然後修改應用上下文路徑以及 Tomcat 埠
     *
     * @return
     */
    @Bean
    public WebServerFactoryCustomizer webServerFactoryCustomizer() {
        /**
         * 使用 ConfigurableServletWebServerFactory
         */
        return new WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>() {
            @Override
            public void customize(ConfigurableServletWebServerFactory configurableServletWebServerFactory) {
                /**
                 * 修改應用上下文路徑以及 Tomcat 埠
                 */
                configurableServletWebServerFactory.setContextPath("/cat");
                configurableServletWebServerFactory.setPort(8084);
            }
        };
    }

    /**
     * 註冊 Servlet 三大元件 之  Servlet
     * 新增 ServletRegistrationBean ,就相當於以前在 web.xml 中配置的 <servlet></servlet>標籤
     */
    @Bean
    public ServletRegistrationBean myServlet() {
        /**第二個引數是個不定引數組,可以配置對映多個請求
         * 相當於以前在 web.xml中配置的 <servlet-mapptin></servlet-mapptin>*/
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(new
                BookServlet(), "/bookServlet");
        return registrationBean;
    }
}

執行測試

  • 上面請求之後,後臺控制檯輸出如下:
// 第一次請求 “bookServlet”
:com.lct.servlet.BookServlet:http://localhost:8084/cat/bookServlet
// bookServlet 中開始轉發到 user/users,此時因為沒有登入,所以被攔截器攔截重定向去了登入頁
com.lct.component.LoginHandlerInterceptor ::: http://localhost:8084/cat/user/users
// 登入成功重定向到 user/users,此時攔截器放行
com.lct.component.LoginHandlerInterceptor ::: http://localhost:8084/cat/user/users
// 登入成功後 再次請求 bookServlet
:com.lct.servlet.BookServlet:http://localhost:8084/cat/bookServlet
// bookServlet轉發到user/users,登入成功後攔截器放行
com.lct.component.LoginHandlerInterceptor ::: http://localhost:8084/cat/user/users
:com.lct.servlet.BookServlet:http://localhost:8084/cat/bookServlet
com.lct.component.LoginHandlerInterceptor ::: http://localhost:8084/cat/user/users