1. context&request&response
request与response对象是起到在服务端与客户端之间传递信息的作用。
- context:是jsp页面包装页面的上下文,由容器创建与初始化。
- request:用来接收客户端提交的信息。
- response:将服务器的数据发送到客户端。
2. 监听来源
- 客户端的请求
- 服务端的响应
3. Servlet 监听器理论
- 在Servlet规范中定义了多种类型的监听器,
监听的事件源分别为 SerlvetConext HttpSession ServletRequest这三个域对象。
3.1 对应三个与对象的方法
a、如三个域对象的创建与销毁方法签名:
ServletRequestListener有以下两个方法
void requestDestroyed(ServletRequestEvent sre)
void requestInitialized(ServletRequestEvent sre)
HttpSessionListener有以下两个方法
void sessionCreated(HttpSessionEvent se)
void sessionDestroyed(HttpSessionEvent se)
ServletContextListener
void contextDestroyed(ServletContextEvent sce)
void contextInitialized(ServletContextEvent sce)
b、三个类型对象域中增、删、改的监听器(3个)
ServletContextAttributeListener,
HttpSessionAttributeListener,
ServletRequestAttributeListener
c、感知型监听器(2个)
监听自己何时被帮到session上,何时解绑了;何时被钝化了,何时被活化了(序列化到某个存储设置中)。
注意:这种监听器不需要注册。某个javabean实现这些接口后就可以监听何时被绑定、解绑或被激活或钝化。
HttpSessionBindingListener:实现该接口的类,能检测自己何时被Httpsession绑定,和解绑
HttpSessionActivationListener:实现该接口的类(要求些javabean必须是实现了Serializable接口的),能监测自己何时随着HttpSession一起激活和钝化。
3.2 应用场景
1>在ServletContextLintener监听器的contextInitialized方法中,进行应用级的资源初始化以便提高效率,在contextDestroyed方法中对应用级的资源进行释放。
2>又比如web应用中,会存在会话,通常的作法是将当前登录的用户存放在session会话中。那么如何统计在线人数话,如何显示出当前登录的用户呢。如何踢出某些已登录的用户呢。就可以通过HttpSessionAttributeListener监听器的attributeAdded方法。
4. 实战练习
4.1 Context 监听
4.1.1 生命周期的监听
创建listenters 类实现ServletContextListener 接口,并进行web.xml配置如下:
package test;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class listenters implements ServletContextListener {
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
System.out.println("web销毁");
}
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
System.out.println("web创建初始化");
}
}
<listener>
<listener-class>test.listenters</listener-class>
</listener>
这样只要创建与销毁Context就会打印相应的文字。
4.1.2 Context上Attribute变化监听。
创建实现ServletContextAttributeListener 接口的类,并进行web.xml配置。
package test;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
public class contextAttribute implements ServletContextAttributeListener {
public void attributeAdded(ServletContextAttributeEvent arg0) {
System.out.println("add"+arg0.getName());
}
public void attributeRemoved(ServletContextAttributeEvent arg0) {
System.out.println("remove");
}
public void attributeReplaced(ServletContextAttributeEvent arg0) {
System.out.println("replace");
}
}
<listener>
<listener-class>test.contextAttribute</listener-class>
</listener>
测试test.jsp
<%
request.setAttribute("one", 1);
request.setAttribute("one", 2);
out.print(request.getAttribute("one"));
request.removeAttribute("one");
%>
这样就会在控制台发现相对应的打印。
遗留问题:上面的替换与移除打印不出来信息
5. session监听
5.1 session 寿命监听
创建类实现了接口 HttpSessionListener ,web.xml配置同上,其中两个方法如下:
sessionCreated()//session创建时调用
sessionDestroyed()//session毁灭时调用
5.2 Session上Attribute变化监听
创建类实现接口 HttpSessionAttributeListener,配置web.xml,
attributeAdded()//当在session中增加属性时触发
attributeRemoved()//当在session中移除属性时触发
attributeReplaced()当在session中替换属性时触发
6. Request 监听
6.1 Request生命周期监听
6.2 Request上Attribute变化监听
7. web3.0配置
3.0不用到web.xml中进行配置,只需要进行注解,如下:
package com.imooc.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener("This is My Servlet 3.0 Listener")//这里就是监听器的注解
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("contextDestroyed");
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("contextInitialized");
}
}