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 類輕鬆實現。