监听三大域对象主要监听域对象的创建和销毁。因此域对象的创建和销毁一定要知道。
1.ServletContext域对象的监听
package cn.itheima.listener;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Enumeration;
import java.util.Set;
import javax.servlet.RequestDispatcher;
import javax.servlet.Servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletException;
public class ApplicationListener implements ServletContextListener {
/**
* 当ServletContext初始化的时候加载,即当应用一加载的时候就会触发这个事件
*/
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext对象被创建了...."+sce.getServletContext());
}
/**
* 当ServletContext对象被销毁的时候会触发这个事件
*/
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext对象被销毁了..."+sce.getServletContext());
}
}
web.xml文件中的配置:
<!-- 配置ServletContext对象的监听器 -->
<listener>
<listener-class>cn.itheima.listener.ApplicationListener</listener-class>
</listener>
运行结果分析:
启动和关闭应用的时候会打印:
2.Session域对象的监听
package cn.itheima.listener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class SessionListener implements HttpSessionListener {
//session 被创建的时候触发这个事件
public void sessionCreated(HttpSessionEvent se) {
System.out.println("session对象被创建了..."+se.getSession());
}
//session 被销毁的时候会触发这个事件
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("session对象被销毁了..."+se.getSession());
}
}
web.xml注册监听器
<!-- 配置Session对象的监听器 -->
<listener>
<listener-class>cn.itheima.listener.SessionListener</listener-class>
</listener>
分别写一个Servlet创建session..另一个Servlet销毁session...
创建session的servlet
package cn.itheima.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class SessionDemo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//创建session对象
HttpSession session = request.getSession();
session.setAttribute("name", "李卫康");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
销毁session的servlet
package cn.itheima.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SessionDemo2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
String name = (String) request.getSession().getAttribute("name");
response.getWriter().write(name);
//session自杀了
request.getSession().invalidate();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
首先访问Demo会打印创建session触发的事件中的函数...然后访问Demo2会销毁session...会打印销毁session触发的事件
解释:session有三种死法,我演示的是自杀式的死法即调用invalidate()方法,会瞬间杀死session..
三种死法:
自杀:invalidate()
超出session的生命周期的时间默认是30分钟...会自动死亡
非正常关闭服务器...如果正常关闭服务器只是会出现session的钝化...当再打开服务器的时候就会session的活化
以上三种死法都会触发销毁session的事件,我就不演示了..
3.request对象的创建和销毁
package cn.itheima.listener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
public class RequestListener implements ServletRequestListener {
//request对象创建的时候会触发
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("request对象被创建了..."+sre.getServletRequest());
}
//request销毁的时候会触发
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("request对象被销毁了..."+sre.getServletRequest());
}
}
配置文件:
<!-- 配置request对象的监听器 -->
<listener>
<listener-class>cn.itheima.listener.RequestListener</listener-class>
</listener>
运行结果: