JavaWeb學習——監聽
監聽三個作用域的生命週期
監聽三個作用域創建和銷燬
application --- ServletContext request ---httpServletRequest session ---httpSession
ServletContext的生命週期監聽
servletcontext創建:啓動服務器的時候 servletContext銷燬:關閉服務器. 從服務器移除項目
實際用途:
1、在服務啓動時,將數據庫中的數據加載進內存,並將其賦值給一個屬性名,其它的 Servlet 就可以通過 getAttribute 進行屬性值的訪問。
2、啓動線程
1、創建ServletContextListener的實現類
public class MyservletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println(" context inited");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println(" context destroy");
}
}
2、在web.xml中進行註冊
<listener>
<listener-class>testContent.MyservletContextListener</listener-class>
</listener>
httpServletRequest的生命週期監聽
request創建:訪問服務器上的任意資源都會有請求出現。 訪問 html: 會 訪問 jsp: 會 訪問 servlet : 會 request銷燬:服務器已經對這次請求作出了響應。
1、創建ServletRequestListener的實現類
public class MyRequestListener implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
System.out.println("init ---------111111111");
}
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
System.out.println("destroy ---------2222222222");
}
}
2、在web.xml中進行註冊
<listener>
<listener-class>testContent.MyRequestListener</listener-class>
</listener>
HttpSessionListenert的生命週期監聽
session的創建:只要調用getSession
訪問html: 不會 jsp: 會 getSession(); servlet: 會
session的銷燬:超時 30分鐘
非正常關閉 銷燬 正常關閉服務器(序列化)
實際用途:
1、統計在線人數
1、創建HttpSessionListener的實現類
public class MySessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("創建session了");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("銷燬session了");
}
}
2、在web.xml中進行註冊
<listener>
<listener-class>testContent.MySessionListener</listener-class>
</listener>
監聽三個作用域屬性狀態變更
ServletContext中屬性的變更監聽
1、設置servletcontext
public class MyHttpAttrListener implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("add------11111");
}
@Override
public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("remove------11111");
}
@Override
public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("replace------11111");
}
}
2、在web.xml中進行註冊
<listener>
<listener-class>testContent.MyHttpAttrListener</listener-class>
</listener>
3、jsp中屬性變更
<%
session.setAttribute("name","123");
session.setAttribute("name","456");
session.removeAttribute("name");
%>
httpSession狀態變更監聽
1、實現一個session的綁定監聽接口,監聽對象與session綁定和解綁定的動作
public class TestBean implements HttpSessionBindingListener {
public String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("valueBound");
}
@Override
public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("valueUnbound");
}
}
2、在jsp中爲session賦值
<%
TestBean testBean = new TestBean();
testBean.setName("123");
session.setAttribute("bean",testBean);
%>
HttpSessionActivationListener序列化與反序列化的監聽
Session的序列化,反序列化作用:把session的值可以存儲到硬盤上,等下一次在使用的時候,在從硬盤上提取出來。
1、對於實現了序列化接口的對象,在存儲時會被進行序列化存儲。
public class TestBean2 implements HttpSessionActivationListener , Serializable {
public String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void sessionWillPassivate(HttpSessionEvent httpSessionEvent) {
}
@Override
public void sessionDidActivate(HttpSessionEvent httpSessionEvent) {
}
}
2、通過實現HttpSessionActivationListener 進行監聽序列化
public class MyHttpSessionActivation implements HttpSessionActivationListener {
@Override
public void sessionWillPassivate(HttpSessionEvent httpSessionEvent) {
System.out.println("init ---------111111111");
}
@Override
public void sessionDidActivate(HttpSessionEvent httpSessionEvent) {
System.out.println("destroy ---------2222222222");
}
}
序列化存儲地址配置:
-
在tomcat裏面 conf/context.xml 裏面配置
對所有的運行在這個服務器的項目生效
-
在conf/Catalina/localhost/context.xml 配置
對 localhost生效。 localhost:8080
-
在自己的web工程項目中的 META-INF/context.xml
<Context>
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="itheima"/>
</Manager>
</Context>
// maxIdleSwap : 1分鐘不用就鈍化
// directory : 鈍化後的那個文件存放的目錄位置: D:\tomcat\apache-tomcat-7.0.52\work\Catalina\localhost\TestDemo\itheima