一. Servlet三大組件
不知道各位小伙伴,是否還記得Servlet、Filter、Listener三大組件的知識點?如果你忘記了,趕緊翻開你的小本本復習回顧一下吧。今天小編會給大家介紹如何在Spring Boot中整合Servlet三大組件,快來看看吧。
我們在進行Servlet開發時,通常首先自定義Servlet、Filter、Listener三大組件,然后在文件web.xm中進行配置。而Spring Boot使用的是內嵌式Servlet容器,并沒有提供外部配置文件web.xml,那么Spring Boot又該如何整合Servlet的相關組件呢?其實Spring Boot給我們提供了組件注冊和路徑掃描兩種方式,來整合Servlet三大組件。
在Spring Boot中,當我們使用組件注冊方式整合內嵌Servlet容器的Servlet、Filter、Listener三大組件時,只需將這些自定義組件通過ServletRegistrationBean、FilterRegistrationBean、ServletListenerRegistrationBean類注冊到容器中即可。
接下來我們就來看看具體的代碼實現吧。
二. 組件注冊方式整合Servlet
1.創建自定義Servlet類
package com.cy.servletComponent;
import org.springframework.stereotype.Component;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/** 自定義Servlet類 */
@Component
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("Hello MyServlet");
}
}
2.創建自定義Servlet類
在chapter05項目中的com.cy.servletComponent包中,我們創建一個繼承了HttpServlet的類MySevlet。
package com.cy.config;
import com.cy.servletComponent.MyServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/** 嵌入式Servlet容器三大組件配置 /
public class ServletConfig {
/* 注冊Servlet組件 */
public ServletRegistrationBean getServlet(MyServlet myServlet) {
ServletRegistrationBean registrationBean = new ServletRegistrationBean(myServlet, "/myServlet");
return registrationBean;
}
}
3. 啟動項目進行測試
項目啟動成功后,在瀏覽器上訪問網址查看數據顯示。
三. 使用組件注冊方式整合Filter
1.創建自定義Filter類
我們可以在com.cy.servletComponent包下創建一個類MyFilter。
package com.cy.servletComponent;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import java.io.IOException;
/** 自定義Filter類 */
public class MyFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("Hello Filter");
filterChain.doFilter(servletRequest, servletResponse);
}
public void destroy() {
}
}
2. 向Servlet組件配置類注冊自定義Filter類
打開之前創建的Servlet組件配置類ServletConfig,將該自定義Filter類使用組件注冊方式進行注冊。
/** 注冊Filter組件 */
@Bean
public FilterRegistrationBean getFilter(MyFilter myFilter) {
FilterRegistrationBean registrationBean = new FilterRegistrationBean(myFilter);
registrationBean.setUrlPatterns(Arrays.asList("/myFilter", "/toLoginPage"));
return registrationBean;
}
3. 請求測試
項目啟動成功后,在瀏覽器上訪問以下網址查看控制臺打印效果(這里由于我們沒有編寫對應路徑的請求處理方法,所以瀏覽器會現404錯誤頁面,這里重點關注控制臺即可)。
控制臺會輸出如下結果:
四. 使用組件注冊方式整合Listener
1.創建自定義Listener類
我們可以在com.cy.servletComponent包下創建一個類MyListener。
package com.cy.servletComponent;
import org.springframework.stereotype.Component;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/** 自定義Listener類 */
public class MyListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce) {
System.out.println("contextInitialized()...");
}
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("contextDestroyed()...");
}
}
2. 向Servlet組件配置類注冊自定義Listener類
我們可以打開之前創建的Servlet組件配置類ServletConfig,將該自定義Listener類使用組件注冊方式進行注冊。
/** 注冊Listener組件 */
public ServletListenerRegistrationBean getListener(MyListener myListener) {
ServletListenerRegistrationBean registrationBean = new ServletListenerRegistrationBean(myListener);
return registrationBean;
}
需要說明的是,Servlet容器提供了很多Listener接口,例如ServletRequestListener、HttpSessionListener、ServletContextListener 等,我們在自定義Listener類時要根據自身需求選擇實現對應接口即可。
3. 執行效果
完成自定義Listener組件注冊后啟動項目,項目啟動成功后查看控制臺打印效果。
單擊IDEA工具控制臺左側的[Exit]按鈕,就可以關閉當前項目。注意,如果我們直接單擊紅色按鈕會強制關閉程序,瀏覽器就無法打印關閉監聽信息,再次查看控制臺打印效果。
將自定義的Servlet組件配置類ServletConfig全部注釋并重啟項目后,自定義的Servlet、Filter、Listener組件仍然生效。出現這種情況的主要原因是:嵌入式Servlet容器對Servlet、Filter、Listener組件進行了自動化識別和配置,而自定義的Servlet、Filter、Listener都繼承/實現了對應的類/接口,同時自定義的Servlet、Filter、Listener組件都使用了@Component注解,這些組件會被自動掃描為Spring組件。
使用ServletRegistrationBean、FilterRegistrationBean、ServletListenerRegistrationBean組件組裝配置的根本目的是對一些請求路徑和參數進行初始化設置和組裝。假設沒有組件注冊類,那么自定義Servlet雖然生效,但無法確定是哪個訪問路徑生效。自定義的Filter會對所有的請求都進行過濾,不會出現選擇性過濾的情況。而自定義的Listener則沒有太大影響,因為定制該組件基本不需要設置什么參數。
五. 路徑掃描整合Servlet三大組件
在Spring Boot中,使用路徑掃描的方式整合內嵌式Servlet 容器的Seviet Fiter 、Lste三大組件時,首先需要在自定義組件上分別添加WebSevle. @WebFiter和Weblistene注解進行聲明,并配置相關注解屬性,然后在項目主程序啟動類上使用@SerletComponentScan注解開啟組件掃描即可。
1.使用路徑掃描方式整合Servlet、Filter、Listener。
為了簡化操作,在上小節自定義組件的基礎上,我們使用路徑掃描的方式來實現Servlet容器的Servlet、Filter、Listener三大組件的整合。
為了避免與之前編寫的使用組件注冊的方式相互干擾,先將之前自定義的Servlet組件配置類ServletConfig全部注釋掉,同時注釋掉自定義Servlet、Filter、Listener三大組件類上的@Component注解。
注釋掉自定義MyServlet組件類上的@Component注解,在MyServlet組件中使用@WebServlet注解聲明并配置相關屬性。
/** 自定義Servlet類 /
//@Component
@WebServlet("/annotationServlet")
public class MyServlet extends HttpServlet {
// ...
}
然后注釋掉自定義MyFilter組件類上的@Component注解,在MyFilter組件中使用@WebFilter注解聲明并配置相關屬性。
/* 自定義Filter類 /
//@Component
@WebFilter(value = {"/annotationLogin", "/annotationMyFilter"})
public class MyFilter implements Filter {
// ...
}
注釋掉自定義MyListener組件類上的@Component注解,在MyListener組件中使用@WebListener注解聲明并配置相關屬性。
/* 自定義Listener類 */
//@Component
@WebListener
public class MyListener implements ServletContextListener {
// ...
}
使用相關注解配置好自定義三大組件后,需在項目主程序啟動類上添加@ServletComponentScan注解,開啟基于注解方式的Servlet組件掃描支持。
package com.cy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@ServletComponentScan // 開啟基于注解方式的Servlet組件掃描支持
@SpringBootApplication
public class Chapter05Application {
public static void main(String[] args) {
SpringApplication.run(Chapter05Application.class, args);
}
}
2.效果測試
啟動項目,項目啟動成功后查看控制臺打印效果。
然后我們在瀏覽器上進行測試。
接著在瀏覽器上查看控制臺打印效果。
單擊IDEA工具控制臺左側的[Exit]按鈕關閉當前項目,再次查看控制臺打印效果。
六. 回顧總結
關于Spring Boot整合Servlet三大組件,小編就給大家分享完了。首先,小編給大家介紹了SpringBoot框架整合Servlet、Filter和Listener三大核心組件;然后介紹了通過SpringBoot路徑掃描整合Servlet三大組件的實現方式;最后我們通過功能測試驗證是否整合成功。