监听器
1.什么是监听器
web监听器是Servlet中一种特殊的类,能帮助开发者监听Web中的特定事件,比如ServletContext,HttpSession,ServletRequest的创建和销毁;变量的创建、销毁和修改等,可以在某些动作前后增加处理,实现监控。例如可以用来统计在线人数等。
2.监听器的简单实现
1.Listener01.java
package com.xxxx.listener; import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; /** * 实现接口:以生命周期为例子 */ @WebListener public class Listener01 implements HttpSessionListener { //当Session对象被创建的时候就会执行 @Override public void sessionCreated(HttpSessionEvent se) { System.out.println("session对象被创建"); } //当Session对象被销毁的时候就会被执行 @Override public void sessionDestroyed(HttpSessionEvent se) { System.out.println("session 对象被销毁"); } }
2.Servlet01.java
package com.xxxx.servlet; 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; import java.io.IOException; @WebServlet("/s01") public class Servlet01 extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("Servlet01...."); //创建Session对象 HttpSession session = request.getSession(); } }
3.Servlet02.java
package com.xxxx.servlet; 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 java.io.IOException; @WebServlet("/s02") public class Servlet02 extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("Servlet02...."); //销毁Session对象 request.getSession().invalidate(); } }
3.案例
查看在线人数
存在的问题,不同浏览器中,看到的在线人数不一样,就算更新也还是不会改变,原因时session对象只在当前浏览器存活。
修改后:点击更新,在线人数也会实现更新了。
1.OnlineListener.java
package com.xxxx.listener; import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; /** * 在线人数统计 * 当有新的Session对象创建时,人数+1。 * 当有Session对象销毁时,人数-1. */ @WebListener public class OnlineListener implements HttpSessionListener { //定义在线人数 private Integer onlineNumber = 0; @Override public void sessionCreated(HttpSessionEvent se) { //人数+1 onlineNumber++; //用Session不好,因为只在当前浏览器存活 //修改前se.getSession().setAttribute("onlineNumber",onlineNumber); //将人数设置到ServletContext作用域中 se.getSession().getServletContext().setAttribute("onlineNumber",onlineNumber); } @Override public void sessionDestroyed(HttpSessionEvent se) { //人数-1 onlineNumber--; //修改前:se.getSession().setAttribute("onlineNumber",onlineNumber); se.getSession().getServletContext().setAttribute("onlineNumber",onlineNumber); } }
2.OnlineServlet.java
package com.xxxx.servlet; 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; import java.io.IOException; @WebServlet("/online") public class OnlineServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //创建Session对象 HttpSession session = req.getSession(); //修改前Integer onlineNumber = (Integer) session.getAttribute("onlineNumber"); Integer onlineNumber = (Integer) session.getServletContext().getAttribute("onlineNumber"); //设置响应类型及编码 resp.setContentType("text/html;charset=UTF-8"); resp.getWriter().write("<h2>当前人数:"+onlineNumber+"</h2>"); } }
销毁session对象:退出操作
1.OnlineListener.java
package com.xxxx.listener; import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; /** * 在线人数统计 * 当有新的Session对象创建时,人数+1。 * 当有Session对象销毁时,人数-1. */ @WebListener public class OnlineListener implements HttpSessionListener { //定义在线人数 private Integer onlineNumber = 0; @Override public void sessionCreated(HttpSessionEvent se) { //人数+1 onlineNumber++; //用Session不好,因为只在当前浏览器存活 //修改前se.getSession().setAttribute("onlineNumber",onlineNumber); //将人数设置到ServletContext作用域中 se.getSession().getServletContext().setAttribute("onlineNumber",onlineNumber); } @Override public void sessionDestroyed(HttpSessionEvent se) { //人数-1 onlineNumber--; //修改前:se.getSession().setAttribute("onlineNumber",onlineNumber); se.getSession().getServletContext().setAttribute("onlineNumber",onlineNumber); } }
2.OnlineServlet.java
package com.xxxx.servlet; 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; import java.io.IOException; @WebServlet("/online") public class OnlineServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //创建Session对象 HttpSession session = req.getSession(); //获取key String key = req.getParameter("key"); //判断key参数是否为空,如果不为空,则表示退出操作 if(key != null&&"logout".equals(key)){ //销毁Session对象 session.invalidate(); return ; } /*登录操作*/ //修改前Integer onlineNumber = (Integer) session.getAttribute("onlineNumber"); Integer onlineNumber = (Integer) session.getServletContext().getAttribute("onlineNumber"); //设置响应类型及编码 resp.setContentType("text/html;charset=UTF-8"); resp.getWriter().write("<h2>当前人数:"+onlineNumber+"</h2> <a href='online?key=logout'>退出</a>"); } }
原文地址:http://www.cnblogs.com/hmy22466/p/16845856.html
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请务用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性