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