1.WEB监听器简介
JavaWeb中的监听器有3个大类,一共8个监听器.
1.监听域对象的创建和销毁
- 监听ServletContext的创建和销毁
- 监听session的创建和销毁
- 监听request的创建和销毁
2.监听域对象的属性变更
- 监听ServletContext域对象的属性变更
- 监听Session域对象的属性变更
- 监听request域对象的属性变更
所谓的域对象的属性变更,就是向域对象中进行以下操作时
*.setAttribute(name,obj); *.removeAttribute(name);
*.getAttributeNames(); *.getAttribute(name);
3.监听JAVABEAN对象在Sessioin中的状态变更(绑定,解绑,钝化,活化)
- 当我们将一个JAVABEAN对象绑定在Session中时,称为JAVABEAN对象被绑定了
session.setAttribute(“k1“,new User()); - 当我们将一个JAVABENA对象从Session中移除时,称为JAVABEAN对象被解绑了.
session.removeAttribute(“k1“); - 服务器正常关闭的时候,session被序列化到硬盘上了.当session中的对象也被序列化到硬 盘上,这个过程称之为钝化
- 当服务器再次启动的时候,将硬盘上的session读取到内存,而且session中的对象也被读
取到内存,这个过程称之为JAVABEAN对象的活化
1.1 监听域对象的创建和销毁
1.监听ServletContext的创建和销毁
应用场景:将读取配置文件在此处执行
public class MyListener01 implements ServletContextListener {
static{
System.out.println("当前的字节码MyListener01.class文件正在被JVM加载");
}
public MyListener01() {
System.out.println("构造函数被执行了");
}
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
// 如果ServletContext被创建,这个方法会被执行
System.out.println("ServletContext被创建了");
// 应用场景: 将读取配置文件在此处执行
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
//如果ServletContext被销毁,这个方法会被执行
System.out.println("ServletContext被销毁了");
//回收系统中资源
}
}
web.xml
<listener>
<listener-class>cn.itcast.testListener01.MyListener01</listener-class>
</listener>
启动服务器,监听器就被创建了.正常停止服务器或者重新加载项目会执行监听器的销毁方法.
代码执行流程
- 我们启动服务器,tomcat就已经将监听器创建好了.
- 当ServletContext被创建的时候,就可以触发监听器中的contextInitialized方法
- 当服务器正常停止或者重新加载项目的时候,触发监听器中的contextDestroyed方法
PS:监听器的生命周期和ServletContext几乎一致,都和WEB应用共存亡. (Filter)
应用场景
监听ServletContext创建的方法contextInitialized可以说是只要WEB项目启动就必须执行的一段代码,相当于我们JAVASE中的main函数之前的static代码块,main函数还没有运行呢,static已经开始运行了. 有什么意义呢? 读取配置文件是非常耗时的事情,我们可以将读取配置文件等类似程序放置在监听ServletContext的区域来执行
监听ServletContext销毁的方法没有太大意义,可以将WEB中我们声明过的资源在这里统一进行回收,但是大家记住:WEB项目是不应该被停止的.例如:淘宝的服务器停一下?百度的服务器停一下?要求级别很高的项目,及时是发布新功能,都要求是热部署的.
2.监听Session的创建和销毁
public class MyListener02 implements HttpSessionListener {
static{
System.out.println("当前的字节码MyListener02.class文件正在被JVM加载");
}
public MyListener02() {
System.out.println("MyListener02构造函数被执行了");
}
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
System.out.println("session被创建了");
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
System.out.println("session被销毁了");
}
}
<listener>
<listener-class>cn.itcast.testListener01.MyListener02</listener-class>
</listener>
问1:访问Servlet时会不会创建session对象?
访问servlet首次遇到request.getSession(),才会创建session
问2:访问JSP时会不会创建session对象?
session是jsp的内建对象,所当我们在jsp里面用session的时候不需要创建,但是session不是servlet的内建对象,你在servlet用session的时候需要创建一个session。
问题3?访问html时会不会创建session对象?
不会
session的生命周期?
何时创建? 访问服务端的动态资源首次遇到request.getSession();
何时销毁?
1_session.invalidate();
2_session超时
3_非正常关闭服务器
应用场景
通过监听session的创建和销毁我们可以粗略的估计某段时间内,访问web的人数,如果有需要,我们可以通过监听session的销毁:我们可以将session中的数据保存下来
3.监听Request的创建和销毁
public class MyListener03 implements ServletRequestListener {
static{
System.out.println("当前的字节码MyListener03.class文件正在被JVM加载");
}
public MyListener03() {
System.out.println("MyListener03构造函数被执行了");
}
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
System.out.println("request被销毁了");
}
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
System.out.println("request被创建了");
}
}
web.xml
<listener>
<listener-class>cn.itcast.listenr.MyListener03</listener-class>
</listener>
问题1?访问servlet会不会创建request
会
问题2?访问jsp会不会创建request
会
问题3?访问html会不会创建requests
会
应用场景:
通过测试request的创建,可以粗略的统计系统的瞬间被访问的情况,为系统压力测试做一个参考
因为我们再监听request创建时,是可以获取到request对象的.当然也可以获取到request中的所有内容.我们可以通过request打印客户请求的路径,看那些资源是被客户频繁访问的,为系统后期性能提升做一个辅助参考,观察用户行为
1.2 监听域对象的属性变更
1.监听ServletContext域对象属性变更
public class MyListener04 implements ServletContextAttributeListener {
public void attributeAdded(ServletContextAttributeEvent scab) {
System.out.println("serlvetContext的属性被添加...");
}
public void attributeReplaced(ServletContextAttributeEvent scab) {
System.out.println("serlvetContext的属性被替换...");
}
public void attributeRemoved(ServletContextAttributeEvent scab) {
System.out.println("serlvetContext的属性被移除...");
}
}
2.监听Session域对象的属性变更
public class MyListener05 implements HttpSessionAttributeListener {
public void attributeRemoved(HttpSessionBindingEvent se) {
System.out.println("session的属性被移除了...");
}
public void attributeAdded(HttpSessionBindingEvent se) {
System.out.println("session的属性被移添加...");
}
public void attributeReplaced(HttpSessionBindingEvent se) {
System.out.println("session的属性被替换了...");
}
}
3.监听request域对象的属性变更
public class MyListener06 implements ServletRequestAttributeListener {
public void attributeAdded(ServletRequestAttributeEvent srae) {
System.out.println("request的属性被添加了");
}
public void attributeRemoved(ServletRequestAttributeEvent srae) {
System.out.println("request的属性被移除了");
}
public void attributeReplaced(ServletRequestAttributeEvent srae) {
System.out.println("request的属性被替换了");
}
}
1.3 监听JAVABEAN对象在session中的状态变更
public class Stu implements HttpSessionBindingListener {
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("javabean对象被解绑了");
}
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("javabean对象被绑定了");
}
}
public class Tea implements HttpSessionActivationListener , Serializable{
private String name="";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println("JAVABEN对象被钝化了了");
}
@Override
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println("JAVABEN对象被活化了");
}
}
应用场景:
通过监听session的中JAVABean对象的绑定和解绑,我们可以观察到用户在和WEB系统交互的过程中,频繁的将那些对象放入到了session中
通过监听JAVABEAN对象在session中的钝化和活化,用户放在session中的数据如果被序列化到硬盘或者从硬盘上加载JAVABEAN对象,知道用户和服务端的一个交互情况