【Servlet事件监听器】
Servlet事件监听器概述
在Java开发中,对于事件的处理非常重要,比如响应键盘的输入、鼠标的点击、窗口的移动等等都要涉及到Java事件的应用。
事件监听器用于对程序中发生的事件进行监听,在监听 的过程中会涉及到以下几个重要部分。
事件(Event):用户的一个操作,如单击一个按钮、调用一个方法、创建一个对象等
事件源:产生事件的对象
事件监听器(Listener):负责监听发生在事件源上的事件
事件处理器:监听器的成员方法,当事件发生的时候触发对应的处理器(成员方法)。当用户进行一个操作触发事件源上的事件时,就会被事件监听器监听到,当监听器听到事件发生时,相应的事件处理器就会对发生的事件进行处理。
事件监听器工作时,可分为几个步骤,具体如下:
将监听器绑定到事件源,也就是注册监听器。
事件发生时会触发监听器的成员方法,即事件处理器,传递事件对象
事件处理器通过事件对象获得事件源,并对事件源进行处理。
在开发Web应用程序时,也经常会使用事件监听器,这个事件监听器被称为Servlet事件监听器,Servlet事件监听器就是一个实现特定接口的Java程序,专门用于监听Web应用程序中ServletContext(application)、HttpSession(session)和ServletRequest(request)等域对象的创建和销毁过程,监听这些域对象属性的修改以及感知绑定到HttpSession域中某个对象的状态。
根据监听事件的不同可以将其分为三类。
用于监听域对象创建和销毁的事件监听器(ServletContextListener接口、HttpSessionListener接口、ServletRequestListener接口)
用于监听域对象属性增加和删除的事件监听器(ServletContextAttribteListener接口、HttpSessionAttributeListener接口,ServletRequestAttributeListener接口)
用于监听绑定到HttpSession域中某个对象状态的事件监听器(HttpSessionBindingListener接口、HttpSessionActivationListener接口)
在Servlet规范中,这三类事件监听器都定义了相应的接口,在编写事件监听器程序时只需实现对应的接口就可以。Web服务器会根据监听器所实现的接口,把它注册到被监听的对象上,当触发了某个对象的监听事件时,Web容器将会调用Servlet监听器与之相关的方法对事件进行处理。
任务一 --监听域对象的生命周期
1.任务目标:
要想对Servlet域对象的生命周期进行监听,首先需要实现域对应的ServletContextListener、HttpSessionListener和ServletRequestListener接口,这些接口中的方法和执行过程非常类似。可以为每一个监听器编写一个单独的类,也可以用一个类来实现这3个接口,从而让这个类具有3个事件监听器的功能。
2.实现步骤
2.1 编写监听器类
编写监听器类,这个类实现了ServletContextListener、HttpSessionListener和ServletRequestListener三个监听器接口,并实现了这些接口中的所有方法.
public class MyListener implements ServletContextListener,
HttpSessionListener,ServletRequestListener {
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext 对象被创建了....");
}
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext 对象被销毁了....");
}
public void sessionCreated(HttpSessionEvent se) {
System.out.println("Session 对象被创建了....");
}
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("Session 对象被销毁了....");
}
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
System.out.println("Request 对象被销毁了....");
}
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
System.out.println("Request 对象被创建了....");
}
在web.xml中注册监听器类
<listener>
<listener-class>MyListener</listener-class>
</listener>
运行http://localhost:8080/indexjsp查看运行结果
任务二–监听域对象的属性变更
1.任务目标
ServletContext、HttpSession和ServletRequest这三个对象,都可以创建、删除和修改它们各自的属性,为了监听这三个对象的属性变更,Servlet API专门提供了一些接口:ServletContextAttributeListener、HttpSessionAttributeListener和ServletRequestAttributeListener接口,分别用于监听ServletContext对象中的属性变更,监听HttpSession对象中的属性变更、监听ServletRequest对象中的属性变更。 通过所学监听器知识,学生学会使用监听器监听域对象的属性变更
2.实现步骤
2.1 创建监听器MyAttributeListener.java(使用注解方式创建)
@WebListener()
public class MyAttribteListener implements ServletContextAttributeListener,
HttpSessionAttributeListener,ServletRequestAttributeListener {
//attributeAdded是增加一个属性时调用。监听器可以通过里面的参数来获取正在增加属性的域对象和被保存到域中的属性对象
//ServletRequestAttributeEvent 可以获取ServletRequest这个域对象。
public void attributeAdded(ServletContextAttributeEvent sae) {
String name = sae.getName();
System.out.println("ServletContext添加属性:" + name + "=" +sae.getServletContext().getAttribute(name));
}
public void attributeRemoved(ServletContextAttributeEvent sae)
{
String name = sae.getName();
System.out.println("ServletContext移除属性: " + name);
}
public void attributeReplaced(ServletContextAttributeEvent sae)
{
String name = sae.getName();
System.out.println("ServletContext替换属性:" + name + "=" +sae.getServletContext().getAttribute(name));
}
public void attributeAdded(HttpSessionBindingEvent hbe) {
String name = hbe.getName();
System.out.println("HttpSession添加属性:" + name + "=" +hbe.getSession().getAttribute(name));
}
public void attributeRemoved(HttpSessionBindingEvent hbe) {
String name = hbe.getName();
System.out.println("HttpSession移除属性: " + name);
}
public void attributeReplaced(HttpSessionBindingEvent hbe) {
String name = hbe.getName();
System.out.println("HttpSession替换属性:" + name + "=" +hbe.getSession().getAttribute(name));
}
public void attributeAdded(ServletRequestAttributeEvent sra) {
String name = sra.getName();
System.out.println("ServletRequest添加属性:" + name + "=" +sra.getServletRequest().getAttribute(name));
}
public void attributeRemoved(ServletRequestAttributeEvent sra)
{
String name = sra.getName();
System.out.println("ServletRequest移除属性: " + name);
}
public void attributeReplaced(ServletRequestAttributeEvent sra)
{
String name = sra.getName();
System.out.println("ServletRequest替换属性:" + name + "=" +sra.getServletRequest().getAttribute(name));
}
}
2.2 制作测试程序testattribute.jsp
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>这是一个测试对象属性信息监听器的页面</h3>
<%
pageContext.getServletContext().setAttribute("username","itcast");
pageContext.getServletContext().setAttribute("username","itheima");
pageContext.getServletContext().removeAttribute("username");
session.setAttribute("username","itcast");
session.setAttribute("username","itheima");
session.removeAttribute("username");
request.setAttribute("username","itcast");
request.setAttribute("username","itheima");
request.removeAttribute("username");
%>
</body>
</html>
运行http://localhost:8080/testattribute.jsp 可以看到运行结果。