Listener
1、功能
- Servlet 2.3 中新增加的另一个功能
- 作用是监听Java Web 程序中的事件
- 对应设计模式中的Listener 模式,当事件发生的时候会自动触发该事件对应的Listener
- 主要用于对Request 、Session 、Context 等进行监控
2、listener模型
常见的监听接口
3、【跟生命周期有关的监听器】
- javax.servlet.ServletContextListener :
public void contextInitialized( ServletContextEvent event )
»当 容器 加载 ( deploy ) 一个 应用 ( "web application" ) 时 呼叫 contextInitialized
»传入的事件对象是 ServletContextEvent
public void contextDestroyed( ServletContextEvent event )
»当 容器 卸载 ( undeploy ) 一个 应用 ( "web application" ) 时 呼叫 contextDestroyed
»传入的事件对象是 ServletContextEvent
测试案例:
package ecut.listener.listener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ApplicationLifecycleListener implements ServletContextListener {
public ApplicationLifecycleListener() {
//System.out.println( "WebApplicationLifecycleListener" );
}
public void contextInitialized( ServletContextEvent sce ) {
ServletContext application = sce.getServletContext();
String name = application.getServletContextName();
String contextPath = application.getContextPath();
System.out.println( "正在加载: " + name + " , 它相应的路径为: " + contextPath );
}
public void contextDestroyed( ServletContextEvent sce ) {
ServletContext application = sce.getServletContext();
String name = application.getServletContextName();
System.out.println( "正在卸载: " + name + " 。");
}
}
<!--display-name(不是listener的子标记)标记设置ServletContextName -->
<display-name>listener</display-name>
<listener>
<listener-class>ecut.listener.listener.ApplicationLifecycleListener</listener-class>
</listener>
运行结果如下:
正在加载: listener , 它相应的路径为: /s
......................
正在卸载: listener 。
......................
正在卸载: listener 。
- javax.servlet.http.HttpSessionListener :
public void sessionCreated( HttpSessionEvent event )
»当 创建 会话 对象时,呼叫 sessionCreated
public void sessionDestroyed( HttpSessionEvent event )
»当 销毁 会话 对象时,呼叫 sessionDestroyed
»销毁 会话对象的时机 : session 的 有效期 到了 、调用 session.invalidate()
»可以在 web.xml 中配置 session 的有效期:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
注意,这里的有效期的时间的单位是 分钟
测试案例:
package ecut.listener.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet( "/session/show" )
public class ShowSessionIdServlet extends HttpServlet {
private static final long serialVersionUID = 3683961647674453725L;
@Override
protected void service( HttpServletRequest request , HttpServletResponse response )
throws ServletException, IOException {
HttpSession session = request.getSession();
// 通过代码来设置 会话的有效期 ( 时间单位是 秒 )
session.setMaxInactiveInterval( 30 ); // 最长发呆时间 ( 从客户端最后一次访问 session 开始持续30秒 )
response.setContentType( "text/html" );
response.getWriter().println( "<h1>" + session.getId() + "</h1>" );
}
}
package ecut.listener.listener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class SessionLifecycleListener implements HttpSessionListener {
@Override
public void sessionCreated( HttpSessionEvent event ) {
HttpSession session = event.getSession();
System.out.println( "会话[ " + session.getId() + " ]创建成功" );
}
@Override
public void sessionDestroyed( HttpSessionEvent event ) {
HttpSession session = event.getSession();
System.out.println( "准备销毁[ " + session.getId() + " ]会话" );
}
}
<listener>
<listener-class>ecut.listener.listener.SessionLifecycleListener</listener-class>
</listener>
运行结果如下:
会话[ D2920D969A73184E4A173615758A314C ]创建成功
准备销毁[ D2920D969A73184E4A173615758A314C ]会话
- javax.servlet.ServletRequestListener :
public void requestInitialized(ServletRequestEvent event)
»当 客户端 发起请求时,即创建 请求对象 ,此时 呼叫 requestInitialized
public void requestDestroyed(ServletRequestEvent event)
»当请求 结束时 ( 响应数据已经全部返回到客户端 ) ,呼叫 requestDestroyed
测试案例:
package ecut.listener.listener;
import javax.servlet.DispatcherType;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
public class RequestLifecycleListener implements ServletRequestListener {