Listener 用于监听java web程序中的事件,比如 创建,修改,删除 Session,request,context等 ,并触发响应的事件
观察者模式:事件发生的时候会自动触发该事件对应 的Listener
Listener 主要对于 Session,request,context 进行监控
具体如下:不同功能Listener需要实现的不同的Listener接口
一个Listener也可以实现多个接口,这样可以多种功能的监听器一起工作
8种监听器 分为三类
1.监听Session,request,context的创建 和 销毁
HttpSessionListener :监听Session的创建和销毁 创建Session的时候执行 sessionCreate 方法 当session的执行invalidate方法的时候,触发SessionDestroyed 方法 ServletRequestListener : 监听Request的创建和销毁 每次用户请求request都会执行requestInitialized方法 request处理完毕之后销毁之前执行 requestDestroyed 注意:如果一个HTML页面中有多个图片,则每请求一次HTML页面可能会触发request事件 ServletContextListener :监听Context的创建和销毁 服务器启动的时候 执行 contextInitialized 方法 服务器关闭或项目卸载 执行 contextDestroyed 方法2.监听对象属性编号 分别:
Session属性变化 HttpSessionAttributeListener Context属性变化 ServletContextAttributeListener Request属性变化 ServletRequestAttributeListener XXXXAdded(); XXXXReplaced(); XXXXRemoved() ; 说明:XXXX表示 Session context request3.监听Session内的对象
HttpSessionBindingListener 当对象被放到Session里执行 valueBound 方法 当对象从Session中移除执行 valueUnbound 方法 HttpSessionActivationListener 服务器关闭的时候,会将Sessioin里的内容保存到硬盘上,这个过程叫 钝化 服务器重新启动的时候,会将session内容从硬盘中重新加载。 当Session中的对象被钝化的时候 sessionWillPassivate 当session中的对象被重新加载 执行sessionDidActivate 常用于session内的对象对session监听 注意: 是Session内的对象,而不是Session本身,不需要web.xml配置实现web.xml 的Listener 配置
1. <listener> 标签 和 <listener-class> 2. <listener> 一般配置在 <servlet> 标签的前面 具体代码如下: <listener> <listener-class>nm.listener.TestListener</listener-class> </listener> 监听器简单的应用实例接下来,我们通过监听器来实现一个简单的统计用户在线人数的简单实例,具体代码如下:
用户登录界面
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>用户登录界面</title> </head> <body> <h1>用户登录界面</h1> <form action="login.do" method="post"> 用户名:<input type="text" /><br/><br/><br/> 密 码:<input type="password" /><br/><br/><br/> <input type="submit" value="提交"/> <input type="reset" value="重置"/> </form> </body> </html>用户登录的简单处理程序,用户名为admin密码为123456
package 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 LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); String uname = request.getParameter("uname"); String upwd = request.getParameter("upwd"); HttpSession session = request.getSession(); //登陆成功后向页面输出当前在线人数 if(uname.equals("admin") && upwd.equals("123456")) { response.getWriter().println("登陆成功~<br/>"); response.getWriter().println("当前在线人数 :"+(Integer)session.getServletContext().getAttribute("uerNumber")+"<br/>"); response.getWriter().println("<a href='http://www.likecs.com/DistoryServlet'>点击退出</a>"); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }