HttpServletRequest婆硬、HttpSession扰才、ServletContext的生命周期都有對應的監(jiān)聽器監(jiān)聽
ServletContextListener
public interface ServletContextListener extends EventListener {
void contextInitialized(ServletContextEvent var1);
void contextDestroyed(ServletContextEvent var1);
}
在web容器啟動和關閉時谊惭,會調(diào)用contextInitialized()和contextDestroyed()方法
/**
* 自定義ServletContextListener叹话,在應用程序啟動加載過程中朝墩,可以做數(shù)據(jù)庫連接醉拓、配置某些參數(shù)操作等
*/
@WebListener
public class DIYServletContextListener implements ServletContextListener{
public DIYServletContextListener() {
}
public void contextInitialized(ServletContextEvent sce) {
ServletContext context = sce.getServletContext();
// 將妹紙放入context中,在web容器關閉之前收苏,都可以通過context獲取妹紙對象
// 如果想主動移除設置的妹紙亿卤,則可以context.removeAttribute()
context.setAttribute("meizhi",new Meizhi("meimeida", 17));
// 獲取Context的初始化參數(shù),WebListener注解沒有設置初始化參數(shù)的功能鹿霸,只能在web.xml中設置
String contextInitVal = context.getInitParameter("contextInitKey");
// 修改tomcat容器對每次會話的設置的ID排吴,默認為JSESSIONID
SessionCookieConfig scconfig = context.getSessionCookieConfig();
scconfig.setName("NOT-JSESSIONID");
}
public void contextDestroyed(ServletContextEvent sce) {
}
}
在web.xml中自定義ServletContext的初始化參數(shù)
<context-param>
<param-name>contextInitKey</param-name>
<param-value>下期大樂透中獎號碼:235643215</param-value>
</context-param>
除了配置@WebListener注解,也可以在web部署描述符中配置懦鼠,如下:
<listener>
<listener-class>DIYServletContextListener</listener-class>
</listener>
ServletContextAttributeListener
環(huán)境上下文屬性監(jiān)聽器钻哩,監(jiān)聽上下文屬性的新增、移除和替換
public interface ServletContextAttributeListener extends EventListener {
void attributeAdded(ServletContextAttributeEvent var1);
void attributeRemoved(ServletContextAttributeEvent var1);
void attributeReplaced(ServletContextAttributeEvent var1);
}
當在ServletContext中添加屬性肛冶、移除屬性或替換屬性街氢,對應著attributeAdded()、attributeRemoved()睦袖、attributeReplaced()方法
@WebListener
public class DIYServletContextAttributeListener implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
// 獲取新增的屬性名稱和屬性值
servletContextAttributeEvent.getName();
servletContextAttributeEvent.getValue();
}
@Override
public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
// servletContext移除屬性時珊肃,做的一些操作
}
@Override
public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
// servletContext替換屬性時,做的一些操作
}
}
HttpSessionListener
HttpSession生命周期監(jiān)聽器馅笙,關注著HttpSession的創(chuàng)建和回收
public interface HttpSessionListener extends EventListener {
void sessionCreated(HttpSessionEvent var1);
void sessionDestroyed(HttpSessionEvent var1);
}
可以通過HttpSessionEvent獲取當前HttpSession伦乔,可以統(tǒng)計在線人數(shù)等
@WebListener
public class DIYHttpSessionListener implements HttpSessionListener{
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
// 獲取剛創(chuàng)建好的HttpSession,進行一些操作
httpSessionEvent.getSession();
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
}
}
HttpSessionAttributeListener
public interface HttpSessionAttributeListener extends EventListener {
void attributeAdded(HttpSessionBindingEvent var1);
void attributeRemoved(HttpSessionBindingEvent var1);
void attributeReplaced(HttpSessionBindingEvent var1);
}
監(jiān)聽著HttpSession的屬性新增延蟹、移除评矩、替換等操作叶堆,可以通過HttpSessionBindingEvent獲取到新增阱飘、移除或替換的屬性名和屬性值
HttpSessionBindingListener
實現(xiàn)該監(jiān)聽器無需做@WebListener注解配置或web.xml配置,但在使用的時候需要該監(jiān)聽器的實例,而HttpSessionListener只需要注解配置沥匈、web.xml配置就可以監(jiān)聽整個應用的所有session
public interface HttpSessionBindingListener extends EventListener {
void valueBound(HttpSessionBindingEvent var1);
void valueUnbound(HttpSessionBindingEvent var1);
}
當session做setAttribute()時蔗喂,則調(diào)用valueBound方法,需要傳入自身監(jiān)聽器的實例高帖;當session做removeAttribute()時缰儿,則調(diào)用valueUnbound()方法
// 調(diào)用httpSessionBindingListener的valueBound()
session.setAttribute("diy-session-binding-listener", new DIYHttpSessionBindingListener());
// 調(diào)用httpSessionBindingListener的valueUnbound()
session.removeAttribute("diy-session-binding-listener");
HttpSessionActivationListener
@WebListener
public class DIYHttpSessionActivationListener implements HttpSessionActivationListener, Serializable {
@Override
public void sessionWillPassivate(HttpSessionEvent httpSessionEvent) {
// 將session從內(nèi)存持久化到磁盤時,會調(diào)用此方法
}
@Override
public void sessionDidActivate(HttpSessionEvent httpSessionEvent) {
// 將session從磁盤反序列化到內(nèi)存時散址,會調(diào)用此方法
}
}
Servlet規(guī)范不要求一個web容器支持分布式應用乖阵,但是他一定要支持HttpSessionActivationListener接口,以使代碼可以支持分布式環(huán)境预麸。
ServletRequestListener
監(jiān)聽請求對象的創(chuàng)建和回收
public interface ServletRequestListener extends EventListener {
void requestDestroyed(ServletRequestEvent var1);
void requestInitialized(ServletRequestEvent var1);
}
請求的生命周期比較短瞪浸,所以兩個方法總是“同時”的執(zhí)行
@WebListener
public class DIYServletRequestListener implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
}
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
HttpServletRequest request = (HttpServletRequest) servletRequestEvent.getServletRequest();
request.setAttribute("233",233);
}
}
ServletRequestAttributeListener
請求屬性變化的監(jiān)聽器,沒啥好說的
public interface ServletRequestAttributeListener extends EventListener {
void attributeAdded(ServletRequestAttributeEvent var1);
void attributeRemoved(ServletRequestAttributeEvent var1);
void attributeReplaced(ServletRequestAttributeEvent var1);
}