javaWeb规范包括三个技术点:servlet 、listener 、filter;监听器就是监听某个对象的的状态变化的组件。监听器是一个java类,用来监听其余javaBean的变化。在javaWeb中监听器是用来监听三个对象(request、session、servletConfig)的状态。监听器的相关概念事件源:
一、被监听的对象(三个域对象 request,session,servletContext)
二、监听器:监听事件源对象, 事件源对象的状态的变化都会触发监听器 。
三、注册监听器:将监听器与事件源进行绑定。
四、响应行为:监听器监听到事件源的状态变化时,所涉及的功能代码(程序员编写代码)html
1) request
2) session
3) servletConfigjava
经过配置web.xmlwancheng程序员
servlet提供了8个监听器web
1) 第一类:监听三个域对象的建立和销毁的监听器3个spring
对象类型 | 对应的监听器 |
---|---|
ServletContext | ServletContextListener |
HttpSession | HttpSessionListener |
HttpServletRequest | ServletRequestListener |
2) 第二类:监听三个域对象变动的监听器(属性添加,属性移除,属性替换)3个数据库
对象类型 | 对应的监听器 |
---|---|
ServletContext | ServletContextAttributeListener |
HttpSession | ServletRequestAttributeListener |
HttpServletRequest | HttpSessionAttributeListener |
3) 第三类:监听HttpSession对象中的JavaBean的状态的改变.(绑定,解除绑定,钝化和活化)2个
浏览器
对象类型 | 对应的监听器 |
---|---|
HttpSession | HttpSessionBindingListener(绑定,解除绑定) |
HttpSession | HttpSessionActivationListener(钝化和活化) |
ServletContextListener监听器的主要做用(至关于监听tongcat启动和关闭):服务器
1) 初始化的工做:初始化对象;初始化数据。好比加载数据库驱动,对链接池的初始化。
2) 加载一些初始化的配置文件;好比spring的配置文件。
3) 任务调度(定时器Timer/TimerTask)session
监听ServletContext域的建立与销毁的监听器,Servlet域的生命周期:在服务器启动建立,服务器关闭时销毁;监听器的编写步骤:app
1) 编写一个监听器类去实现监听器接口
2) 覆盖监听器的方法
3) 须要在web.xml中进行配置(注册)
例子:
监听Httpsession域的建立与销毁的监听器。HttpSession对象的生命周期:第一次调用request.getSession时建立;销毁有如下几种状况(服务器关闭、session过时、 手动销毁)
例子:统计在线人数,每个浏览器访问都会记录一次,当一个浏览器退出时就会让在线人数减掉1.
在src/main/webapp下新建一个名为web的包,并在web包下面新建两个类,分别是:
CountLoginListen.java
package web; import javax.servlet.ServletContext; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class CountListener implements HttpSessionListener { private int count = 0; public void sessionCreated(HttpSessionEvent se) { count++; HttpSession session = se.getSession(); ServletContext sct = session.getServletContext(); sct.setAttribute("count", count); } public void sessionDestroyed(HttpSessionEvent se) { count--; HttpSession session = se.getSession(); ServletContext sct = session.getServletContext(); sct.setAttribute("count", count); } }
LoginOutServlet.java
package web; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class LogoutServlet extends HttpServlet { public void service(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/html;charset=utf8"); PrintWriter out = response.getWriter(); HttpSession session = request.getSession(); session.invalidate(); out.close(); } }
2) 配置web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <listener> <listener-class>web.CountListener</listener-class> </listener> <servlet> <servlet-name>h</servlet-name> <servlet-class>web.LogoutServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>h</servlet-name> <url-pattern>/logout</url-pattern> </servlet-mapping>
</web-app>
3) 在webapp下新建一个jsp文件,名为:index.jsp
<%@ page language="java" contentType="text/html; charset=utf8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> </head> <body> 当前有<%=application.getAttribute("count").toString() %> <a href="logout">登出</a> </body> </html>
三、ServletRequestListener
一、ServletContextAttibuteListener
二、HttpSessionBindingListener
三、HttpSessionActivationListener
一、
二、
三、