久久精品国产亚洲高清|精品日韩中文乱码在线|亚洲va中文字幕无码久|伊人久久综合狼伊人久久|亚洲不卡av不卡一区二区|精品久久久久久久蜜臀AV|国产精品19久久久久久不卡|国产男女猛烈视频在线观看麻豆

千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

手機(jī)站
千鋒教育

千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

千鋒教育

掃一掃進(jìn)入千鋒手機(jī)站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學(xué)習(xí)站小程序
隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

當(dāng)前位置:首頁  >  技術(shù)干貨  > Spring Boot整合Servlet三大組件

Spring Boot整合Servlet三大組件

來源:千鋒教育
發(fā)布人:zyh
時(shí)間: 2023-06-12 17:06:00 1686560760

  一. Servlet三大組件

  不知道各位小伙伴,是否還記得Servlet、Filter、Listener三大組件的知識點(diǎn)?如果你忘記了,趕緊翻開你的小本本復(fù)習(xí)回顧一下吧。今天小編會給大家介紹如何在Spring Boot中整合Servlet三大組件,快來看看吧。

  我們在進(jìn)行Servlet開發(fā)時(shí),通常首先自定義Servlet、Filter、Listener三大組件,然后在文件web.xm中進(jìn)行配置。而Spring Boot使用的是內(nèi)嵌式Servlet容器,并沒有提供外部配置文件web.xml,那么Spring Boot又該如何整合Servlet的相關(guān)組件呢?其實(shí)Spring Boot給我們提供了組件注冊和路徑掃描兩種方式,來整合Servlet三大組件。

Spring Boot整合Servlet三大組件

  在Spring Boot中,當(dāng)我們使用組件注冊方式整合內(nèi)嵌Servlet容器的Servlet、Filter、Listener三大組件時(shí),只需將這些自定義組件通過ServletRegistrationBean、FilterRegistrationBean、ServletListenerRegistrationBean類注冊到容器中即可。

  接下來我們就來看看具體的代碼實(shí)現(xiàn)吧。

  二. 組件注冊方式整合Servlet

  1.創(chuàng)建自定義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.創(chuàng)建自定義Servlet類

  在chapter05項(xiàng)目中的com.cy.servletComponent包中,我們創(chuàng)建一個(gè)繼承了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. 啟動項(xiàng)目進(jìn)行測試

  項(xiàng)目啟動成功后,在瀏覽器上訪問網(wǎng)址查看數(shù)據(jù)顯示。

1684312955307.image

  三. 使用組件注冊方式整合Filter

  1.創(chuàng)建自定義Filter類

  我們可以在com.cy.servletComponent包下創(chuàng)建一個(gè)類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類

  打開之前創(chuàng)建的Servlet組件配置類ServletConfig,將該自定義Filter類使用組件注冊方式進(jìn)行注冊。 

/** 注冊Filter組件 */
@Bean
public FilterRegistrationBean getFilter(MyFilter myFilter) {
FilterRegistrationBean registrationBean = new FilterRegistrationBean(myFilter);
registrationBean.setUrlPatterns(Arrays.asList("/myFilter", "/toLoginPage"));
return registrationBean;
}

  3. 請求測試

  項(xiàng)目啟動成功后,在瀏覽器上訪問以下網(wǎng)址查看控制臺打印效果(這里由于我們沒有編寫對應(yīng)路徑的請求處理方法,所以瀏覽器會現(xiàn)404錯(cuò)誤頁面,這里重點(diǎn)關(guān)注控制臺即可)。

1684312974325.image

  控制臺會輸出如下結(jié)果:

1684312985150.image

  四. 使用組件注冊方式整合Listener

  1.創(chuàng)建自定義Listener類

  我們可以在com.cy.servletComponent包下創(chuàng)建一個(gè)類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類

  我們可以打開之前創(chuàng)建的Servlet組件配置類ServletConfig,將該自定義Listener類使用組件注冊方式進(jìn)行注冊。 

/** 注冊Listener組件 */
public ServletListenerRegistrationBean getListener(MyListener myListener) {
ServletListenerRegistrationBean registrationBean = new ServletListenerRegistrationBean(myListener);
return registrationBean;
}

  需要說明的是,Servlet容器提供了很多Listener接口,例如ServletRequestListener、HttpSessionListener、ServletContextListener 等,我們在自定義Listener類時(shí)要根據(jù)自身需求選擇實(shí)現(xiàn)對應(yīng)接口即可。

  3. 執(zhí)行效果

  完成自定義Listener組件注冊后啟動項(xiàng)目,項(xiàng)目啟動成功后查看控制臺打印效果。

1684313000364.image

  單擊IDEA工具控制臺左側(cè)的[Exit]按鈕,就可以關(guān)閉當(dāng)前項(xiàng)目。注意,如果我們直接單擊紅色按鈕會強(qiáng)制關(guān)閉程序,瀏覽器就無法打印關(guān)閉監(jiān)聽信息,再次查看控制臺打印效果。

1684313011268.image

  將自定義的Servlet組件配置類ServletConfig全部注釋并重啟項(xiàng)目后,自定義的Servlet、Filter、Listener組件仍然生效。出現(xiàn)這種情況的主要原因是:嵌入式Servlet容器對Servlet、Filter、Listener組件進(jìn)行了自動化識別和配置,而自定義的Servlet、Filter、Listener都繼承/實(shí)現(xiàn)了對應(yīng)的類/接口,同時(shí)自定義的Servlet、Filter、Listener組件都使用了@Component注解,這些組件會被自動掃描為Spring組件。

  使用ServletRegistrationBean、FilterRegistrationBean、ServletListenerRegistrationBean組件組裝配置的根本目的是對一些請求路徑和參數(shù)進(jìn)行初始化設(shè)置和組裝。假設(shè)沒有組件注冊類,那么自定義Servlet雖然生效,但無法確定是哪個(gè)訪問路徑生效。自定義的Filter會對所有的請求都進(jìn)行過濾,不會出現(xiàn)選擇性過濾的情況。而自定義的Listener則沒有太大影響,因?yàn)槎ㄖ圃摻M件基本不需要設(shè)置什么參數(shù)。

  五. 路徑掃描整合Servlet三大組件

  在Spring Boot中,使用路徑掃描的方式整合內(nèi)嵌式Servlet 容器的Seviet Fiter 、Lste三大組件時(shí),首先需要在自定義組件上分別添加WebSevle. @WebFiter和Weblistene注解進(jìn)行聲明,并配置相關(guān)注解屬性,然后在項(xiàng)目主程序啟動類上使用@SerletComponentScan注解開啟組件掃描即可。

  1.使用路徑掃描方式整合Servlet、Filter、Listener。

  為了簡化操作,在上小節(jié)自定義組件的基礎(chǔ)上,我們使用路徑掃描的方式來實(shí)現(xiàn)Servlet容器的Servlet、Filter、Listener三大組件的整合。

  為了避免與之前編寫的使用組件注冊的方式相互干擾,先將之前自定義的Servlet組件配置類ServletConfig全部注釋掉,同時(shí)注釋掉自定義Servlet、Filter、Listener三大組件類上的@Component注解。

  注釋掉自定義MyServlet組件類上的@Component注解,在MyServlet組件中使用@WebServlet注解聲明并配置相關(guān)屬性。 

/** 自定義Servlet類 /
//@Component
@WebServlet("/annotationServlet")
public class MyServlet extends HttpServlet {
// ...
}
然后注釋掉自定義MyFilter組件類上的@Component注解,在MyFilter組件中使用@WebFilter注解聲明并配置相關(guān)屬性。
/* 自定義Filter類 /
//@Component
@WebFilter(value = {"/annotationLogin", "/annotationMyFilter"})
public class MyFilter implements Filter {
// ...
}
注釋掉自定義MyListener組件類上的@Component注解,在MyListener組件中使用@WebListener注解聲明并配置相關(guān)屬性。
/* 自定義Listener類 */
//@Component
@WebListener
public class MyListener implements ServletContextListener {
// ...
}

  使用相關(guān)注解配置好自定義三大組件后,需在項(xiàng)目主程序啟動類上添加@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.效果測試

  啟動項(xiàng)目,項(xiàng)目啟動成功后查看控制臺打印效果。

1684313030633.image

  然后我們在瀏覽器上進(jìn)行測試。

1684313047724.image

  接著在瀏覽器上查看控制臺打印效果。

1684313058518.image

  單擊IDEA工具控制臺左側(cè)的[Exit]按鈕關(guān)閉當(dāng)前項(xiàng)目,再次查看控制臺打印效果。

1684313071128.image

  六. 回顧總結(jié)

  關(guān)于Spring Boot整合Servlet三大組件,小編就給大家分享完了。首先,小編給大家介紹了SpringBoot框架整合Servlet、Filter和Listener三大核心組件;然后介紹了通過SpringBoot路徑掃描整合Servlet三大組件的實(shí)現(xiàn)方式;最后我們通過功能測試驗(yàn)證是否整合成功。

聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
請您保持通訊暢通,專屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
免費(fèi)領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學(xué) 138****2860 剛剛成功領(lǐng)取
王同學(xué) 131****2015 剛剛成功領(lǐng)取
張同學(xué) 133****4652 剛剛成功領(lǐng)取
李同學(xué) 135****8607 剛剛成功領(lǐng)取
楊同學(xué) 132****5667 剛剛成功領(lǐng)取
岳同學(xué) 134****6652 剛剛成功領(lǐng)取
梁同學(xué) 157****2950 剛剛成功領(lǐng)取
劉同學(xué) 189****1015 剛剛成功領(lǐng)取
張同學(xué) 155****4678 剛剛成功領(lǐng)取
鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
董同學(xué) 138****2867 剛剛成功領(lǐng)取
周同學(xué) 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT
PUE是什么?

一、PUE是什么PUE,即功耗比(Power Usage Effectiveness),是數(shù)據(jù)中心的能源效率指標(biāo)。它是數(shù)據(jù)中心總功耗與設(shè)備功耗的比值,用于評估數(shù)據(jù)中...詳情>>

2023-10-15 07:13:07
graph cut和graph cuts有什么區(qū)別?

1.語境不同graph cut”通常在描述一個(gè)操作時(shí)使用,比如”perform a graph cut”,它指的是在圖中找到一個(gè)切割,將圖劃分為兩個(gè)...詳情>>

2023-10-15 07:02:16
什么是雙機(jī)熱備?

一、雙機(jī)熱備的原理雙機(jī)熱備是指在系統(tǒng)中配置兩臺服務(wù)器(主服務(wù)器和備份服務(wù)器),兩者通過高速網(wǎng)絡(luò)連接進(jìn)行實(shí)時(shí)數(shù)據(jù)同步和狀態(tài)同步。主服務(wù)器...詳情>>

2023-10-15 06:37:02
偏最小二乘支持向量機(jī)和支持向量機(jī)回歸的區(qū)別是什么?

1.模型構(gòu)建的理論基礎(chǔ)不同支持向量機(jī)回歸(SVR)基于統(tǒng)計(jì)學(xué)習(xí)理論,其主要思想是找到一個(gè)超平面,使得大部分?jǐn)?shù)據(jù)點(diǎn)都在這個(gè)超平面的一定范圍內(nèi),...詳情>>

2023-10-15 06:30:45
VAE、GAN和transformer有什么區(qū)別?

1.模型結(jié)構(gòu)不同VAE(變分自編碼器)是一種生成模型,其基于概率圖模型和自編碼器,能夠?qū)W習(xí)數(shù)據(jù)的潛在分布。GAN(生成對抗網(wǎng)絡(luò))同樣是一種生成...詳情>>

2023-10-15 06:10:12