springboot 配置 servlet 三大組件(Servlet、Filter、Listener)

Servlet、Filter、Listener 是 JavaEE Web 服務規定的服務器動態組件,由開發者編寫,由 Web 容器創建,並保證單例以及線程安全性,其中加載順序爲 Linstener —> Fliter —> Servlet 。
在之前的項目開發中,我們把這些組件都註冊在 web.xml 配置文件中。而在 springboot 項目中,它提供了相應的對象讓我們更方便地註冊這些組件。

Servlet

Servlet 是用來處理客戶端請求的動態資源,也就是當我們在瀏覽器中鍵入一個地址回車跳轉後,請求就會被髮送到對應的 Servlet 上進行處理。

定義一個 servlet

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyDefineServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException,IOException{
		
		resp.getWriter().write("MyDefineServlet=========");
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException,IOException{
		super.doGet(req, resp);
	}
}

註冊到容器中

import java.util.Arrays;

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.xiao.component.MyDefineFilter;
import com.xiao.component.MyDefineListener;
import com.xiao.component.MyDefineServlet;

@Configuration
public class ServerConfig {

	// 註冊三大組件
	@Bean
	public ServletRegistrationBean<MyDefineServlet> myservlet() {
		ServletRegistrationBean<MyDefineServlet> servletRegistrationBean = 
				new ServletRegistrationBean<MyDefineServlet>(new MyDefineServlet(), "/hello");
		return servletRegistrationBean;
	}
	
	@Bean
	public FilterRegistrationBean<MyDefineFilter> myFilter(){
		FilterRegistrationBean<MyDefineFilter> filterRegistrationBean = 
				new FilterRegistrationBean<MyDefineFilter>();
		filterRegistrationBean.setFilter(new MyDefineFilter());
		filterRegistrationBean.setUrlPatterns(Arrays.asList("/success","/hello"));
		return filterRegistrationBean;
	}
	
	@Bean
	public ServletListenerRegistrationBean<MyDefineListener> myListener(){
		ServletListenerRegistrationBean<MyDefineListener> listenerRegistrationBean = 
				new ServletListenerRegistrationBean<MyDefineListener>(new MyDefineListener());
		return listenerRegistrationBean;
	}

}

Filter

Filter 與 Servlet 在很多的方面極其相似, 但是Servlet主要負責處理請求,而 Filter 主要負責攔截請求,和放行。Filter 實際上是一個接口,定義了一套規則,等待具體的類來實現該接口,而具體的攔截操作還需要 web 容器來實現。

定義一個 Filter

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class MyDefineFilter implements Filter {

	@Override
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
			throws IOException, ServletException {
		System.out.println("MyDefineFilter............");
		chain.doFilter(req, resp);
	}

}

Filter 的註冊與 servlet 的註冊類似,示例代碼見 Servlet 的註冊

Listener

Listener 是監聽器,在 JavaWeb 的 Listener 可以監聽 Application、Session、Request 對象,當這些對象發生變化就會調用對應的監聽方法,本質是方法回調。

定義一個 Listener

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

public class MyDefineListener implements ServletContextListener {

	@Override
	public void contextInitialized(ServletContextEvent sce) {
		System.out.println("contextInitialized..........");
	}
	
	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		System.out.println("contextDestroyed..........");
	}
}

Listener 的註冊與 servlet 的註冊類似,示例代碼見 Servlet 的註冊

啓動項目可以看到監聽已經觸發
在這裏插入圖片描述輸入 /hello 請求,可以發現另外兩個組件也生效了。
在這裏插入圖片描述
控制檯打印
在這裏插入圖片描述

寫好的組件可以很方便地註冊到容器中。springboot 初衷就是減少開發中繁雜的配置,現在也一直是這麼做的,絕大部分配置都可以通過 java 類輕鬆實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章