标签:row 就会 场景 lin cti 序列化 init out eve
监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法立即被执行。
JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。
共包括以下3类8种监听器:
ServletContext创建与销毁监听:ServletContextListener
Httpsession的创建与销毁监听:HttpSessionListener
HttpServletRequest创建与销毁监听:ServletRequestListener
包括属性的添加,删除,替换(key值一样的时候,调用两次set就会触发这个事件)
ServletContex的属性变化的监听:ServletContextAttributeListener
Httpsession的属性变化的监听:HttpSessionAttributeListener
HttpServletRequest的属性的变化的监听:ServletRequestAttributeListener
保存在Session域中的对象可以有多种状态:
? 绑定session.setAttribute("bean",Object)到Session中;
? 从 Session域中解除session.removeAttribute("bean")绑定;
? 随Session对象持久化到一个存储设备中;
? 随Session对象从一个存储设备中恢复
Servlet 规范中定义了两个特殊的监听器接口"HttpSessionBindingListener和HttpSessionActivationListener"来帮助JavaBean 对象了解自己在Session域中的这些状态,实现这两个接口的类不需要注册。
HttpSessionBindingListener:实现了HttpSessionBindingListener接口的JavaBean对象可以感知自己被绑定到Session中和 Session中删除的事件
HttpSessionActivationListener:实现了HttpSessionActivationListener接口的JavaBean对象可以感知自己被活化(反序列化)和钝化(序列化)的事件
@WebListener
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("-----------contextInitialized-------------");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("-----------contextDestroyed-------------");
}
}
可以实现在系统启动时获取文件或数据库中配置的全局参数、设置系统缓存、预加载内容等。
比如原来SSM项目web.xml文件中spring的配置:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
ServletContextListener的第二个重要应用场景就是可以使一些程序跟随系统一起运行,比如启动定时任务。
以下是一个quartz定时的启动demo:
public class DemoListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
DemoManager demoManager = null;
try {
demoManager = new DemoManager(new StdSchedulerFactory().getScheduler());
} catch (SchedulerException e) {
e.printStackTrace();
}
demoManager.addJob(DemoJob.class,"demoJob","Demo","0/8 * * * * ? ");
System.out.println("DemoListener 启动!");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
}
}
@WebServlet(name = "MyServlet2", urlPatterns = "/myServlet2")
public class MyServlet2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("----------doPost-----------");
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("----------doGet-----------");
ServletContext context = getServletContext();
context.setAttribute("name","123");
}
}
@WebListener
public class MyHttpSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent event) {
System.out.println("session: " + event.getSession().getId() + " Created");
}
@Override
public void sessionDestroyed(HttpSessionEvent event) {
System.out.println("session: " + event.getSession().getId() + " Destroyed");
}
}
@WebListener
public class MyHttpSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent event) {
System.out.println("session: " + event.getSession().getId() + " Created");
ServletContext context = event.getSession().getServletContext();
Integer count = (Integer) context.getAttribute("onlineCount");
if (null == count) {
count = 0;
} else {
count++;
}
context.setAttribute("onlineCount", count);
}
@Override
public void sessionDestroyed(HttpSessionEvent event) {
System.out.println("session: " + event.getSession().getId() + " Destroyed");
ServletContext context = event.getSession().getServletContext();
Integer count = (Integer) context.getAttribute("onlineCount");
if(null == count){
count = 0;
}else{
count--;
context.setAttribute("onlineCount", count);
}
}
}
标签:row 就会 场景 lin cti 序列化 init out eve
原文地址:https://www.cnblogs.com/wind-ranger/p/14171708.html