监听器启动顺序
1.多个监听器时按照web.xml加载顺序执行
2.优先级:监听器→过滤器→servlet
监听对象划分
1.用于监听应用程序对象(ServletContext)的事件监听器
2.用于监听用户会话对象(HttpSession)的事件监听器
3.用于监听请求消息对象(ServletRequest)的事件监听器
web.xml加入监听
<listener>
<listener-class>com.listener.FirstListener</listener-class>
</listener>
创建监听器
public class Listenerdemo implements ServletContextListener
{
//启动时执行
public void contextInitialized(ServletContextEvent servletcontextevent){
}
//结束时执行
public void contextDestroyed(ServletContextEvent servletcontextevent){
}
}
监听域对象自身的创建和销毁的事件监听器
ServletContext、HttpSession、ServletRequest
1.ServletContext主要用途:定时器、全局属性对象
public class Listenerdemo implements ServletContextListener
{
public void contextInitialized(ServletContextEvent servletcontextevent){
String initParam = servletcontextevent.getServletContext().getInitParameter("initParam");
servletcontextevent.getServletContext().setAttribute("变量名","变量值");
}
public void contextDestroyed(ServletContextEvent servletcontextevent){
}
}
web.xml配置
//配置全局变量
<context-param>
//变量名称
<param-name>initParam</param-name>
//变量值
<param-value>baidu</param-value>
</context-param>
2.HttpSession主要用途:统计在线人数、记录访问日志
public class HttpSessionListener implements HttpSessionListener{
//浏览器访问执行
public void sessionCreated(HttpSessionEvent httpsessionevent){
}
//销毁session时执行
public void sessionDestroyed(HttpSessionEvent httpsessionevent){
}
}
web.xml注册监听器
<listener>
<listener-class>com.listener.MyHttpSessionListener</listener-class>
</listener>
//session超时时间
<session-config>
<session-timeout>1</session-timeout>
</session-config>
3.ServletRequest用于读取参数和记录访问历史
public class MyServletRequestListener implements ServletRequestListener{
public void requestInitialized(ServletRequestEvent servletrequestevent){
//获取请求的参数
String name = servletrequestevent.getServletRequest().getParameter("name");
}
public void requestDestroyed(ServletRequestEvent servletrequestevent){
}
}
监听域对象的属性的增加和删除的事件监听器
- ServletContexAttributeListener
- HttpSessionAttributeListener
- ServletRequestAttributeListener
每个监听器中都有3个相同的方法
attributeAdded 方法
当向被监听对象中增加一个属性时,web容器就调用事件监听器的attributeAdded方法进行响应,这个方法接收一个事件类型的参数,监听器可以通过这个参数来获得正在增加属性的域对象和被保存到域中的属性对象
各个域属性监听器中的完整语法定义为:
public void attributeAdded(ServletContextAttributeEvent scae) public void attributeReplaced(HttpSessionBindingEvent hsbe) public void attributeRmoved(ServletRequestAttributeEvent srae)
attributeRemoved 方法
当删除被监听对象中的一个属性时,web容器调用事件监听器的attributeRemoved方法进行响应
各个域属性监听器中的完整语法定义为:
public void attributeRemoved(ServletContextAttributeEvent scae)
public void attributeRemoved (HttpSessionBindingEvent hsbe)
public void attributeRemoved (ServletRequestAttributeEvent srae)
attributeReplaced 方法
当监听器的域对象中的某个属性被替换时,web容器调用事件监听器的attributeReplaced方法进行响应
各个域属性监听器中的完整语法定义为:
public void attributeReplaced(ServletContextAttributeEvent scae) public void attributeReplaced (HttpSessionBindingEvent hsbe) public void attributeReplaced (ServletRequestAttributeEvent srae)
监听绑定到HttpSession域中的某个对象的状态的事件监听器
钝化:1,由Session.StandardManager:Tocat服务器关闭或Web应用程序被重新加载时把当前内存中的Session序列化到文件或数据库中。
2,由Session.Persistentmanager:除了1,中的两种,第3种可以将不常用的Session序列化到文件或数据库中。
(默认Tocat两种钝化驱动:org.apache.Catalina.FileStore和org.apache.Catalina.JDBCStore)
活化:服务器启动是把钝化的Seesion反序列化到服务器上
前提:先绑定session
绑定就是session.setAttribute()把属性保存到Session对象当中,解除绑定:session.getAttribute()
(1)HttpSession【Binding】Listener //绑定、解除绑定
a) 创建一个javabean类,实现接口【HttpSessionBindingListener,】无需到Web.xml注册
b) 2个方法
1) void valueBound 绑定 JSP: request.getsession.setattribute("ab",new javabean全名);
2) void valueUnbound 解除绑定 JSP: request.getsession().removeAttribute("ab")
(2)HttpSessionActivationListener //钝化(持久化到存储设备时)、活化(从存储设备恢复)
a) 在已经创建的javabean类,实现接口HttpSessionActivationListener无需到Web.xml注册
b) 2个方法
1) void sessionWillPassivate 钝化 JSP: 无需写,前提javabean进行绑定了
2) void sessionDidActivate 活化 JSP:request.getSession.getAttribute("ab");
需要【活化必须】再继承一个接口:【Serializable】
public void valueBound(HttpSessionBindingEvent arg0) {
System.out.println("valueBound:" + arg0.getName());
}
public void valueUnbound(HttpSessionBindingEvent arg0) {
System.out.println("valueUnbound:" + arg0.getName());
}
// 活化
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println("sessionDidActivate:" + se.getSource());
}
// 钝化
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println("sessionWillPassivate:" + se.getSource());
}