監聽器:listener是servlet規范中定義的一種特殊類。用於監聽servletContext、HttpSession和servletRequest等域對象的創建和銷毀事件。監聽域對象的屬性發生修改的事件。
用於在事件發生前、發生后做一些必要的處理。其主要可用於以下方面:
1、統計在線人數和在線用戶
2、系統啟動時加載初始化信息
3、統計網站訪問量
4、記錄用戶訪問路徑
方法1: 使用Springboot提供了RegistrationBean
的子類ServletListenerRegistrationBean 用於注冊Filter,完成過濾器的設置首先我們創建一個MyHttpSessionListener類
package com.example.spingbootdemo1.listener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class MyHttpSessionListener implements HttpSessionListener { private static int onlineNum = 0; public void sessionCreated(HttpSessionEvent se) { onlineNum++; } public void sessionDestroyed(HttpSessionEvent se) { onlineNum--; } }
然后我們創建一個控制器UserController
import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpSession; public class UserController { @RequestMapping("/onlineCount") public String onlineCount(){ return"網站當前在線人數為:"+ MyHttpSessionListener.onlineNum; } @RequestMapping("/index") public String index(HttpSession httpSession){ //在訪問首頁的時候觸發session的操作 httpSession.setAttribute("username","xiadewang");return"首頁"; } }
上面我們已經把監聽器和控制層的工作完成了,但是我們知道springboot里面的監聽器實際上底下就是spring和springmvc相關的東西,再下面就是servlet,在以前的老項目中我們需要在web.xml中多監聽器做配置。而在springboot中我們沒有了web.xml等相關xml配置文件,取而代之的是使用@Configuration注解在java代碼中實現相關配置。於是我們可以創建一個配置類,代碼如下:
@Configuration public class MyMvcConfig { @Bean public ServletListenerRegistrationBean listenerRegist() { ServletListenerRegistrationBean srb=new ServletListenerRegistrationBean(); srb.setListener(new MyHttpSessionListener()); return srb; } }
這里我們使用@Configuration注解和@Bean注解實現了一個監聽器的注冊綁定配置。@Configuration其實就是告訴spring,spring容器要怎么配置(怎么去注冊bean,怎么去處理bean之間的關系(裝配)=>@Configuration相當於<beans></beans>便簽,作用為配置spring容器(應用上下文)。那么久很好理解了,@Bean的意思就是,我要獲取這個bean的時候,你spring要按照這種方式去幫我獲取到這個bean。@Bean注解的方法會實例化、配置並初始化一個新的對象,這個對象會由spring IoC 容器管理。
方法2: 使用@WebListener注解完成過濾器的設置
在MyHttpSessionListener上面加上@WebListener注解,
package com.example.spingbootdemo1.listener; import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; @WebListener public class MyHttpSessionListener implements HttpSessionListener { public static int onlineNum = 0; public void sessionCreated(HttpSessionEvent se) { onlineNum++; } public void sessionDestroyed(HttpSessionEvent se) { onlineNum--; } }
然后在啟動類上加@ServletComponentScan注解提供支持掃描webListener
/*** * 使用@ServletComponentScan配合@WebListener后,務必要刪除之前創建的MyMvcConfig這個類。實現過濾器配置二者選其一即可。 * springboot默認會檢索啟動類所在包和子包下的所有spring容器相關的注解(比如@Controller、@Component等),但是像@WebFilter和@WebListener之類的不會 */ @ServletComponentScan @SpringBootApplication public class Spingbootdemo1Application { public static void main(String[] args) { SpringApplication.run(Spingbootdemo1Application.class, args); } }