版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/qq_38720976/article/details/84474950

监听器基本概念

  JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。

监听器的分类

  在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为ServletContextHttpSessionServletRequest这三个域对象Servlet规范针对这三个对象上的操作,又把多种类型的监听器划分为三种类型:

1)ServletContext监听

ServletContextListener:用于对Servlet整个上下文进行监听(创建、销毁)。

ServletContextAttributeListener:对Servlet上下文属性的监听(增删改属性)。

2)Session监听

HttpSessionListener接口:对Session的整体状态的监听。

HttpSessionAttributeListener接口:对Session的属性监听。

3)Request监听

ServletRequestListener:用于对Request请求进行监听(创建、销毁)。

ServletRequestAttributeListener:对Request的属性的监听(增删改属性)。

 示例:用监听器统计网站在线人数

    原理:每当有一个访问连接到服务器时,服务器就会创建一个session来管理会话。那么我们就可以通过统计session的数量来获得当前在线人数。  所以这里用到的是HttpSessionBindingListener。

特别提醒:由于浏览器会保存一段时间session数据,所以我们最好多使用几个浏览器测试在线人数效果。

一.监听器

  1:创建监听器类HttpSessionBindTest

package com.iflytek.xxsystem.listener;import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;@WebListener
public class HttpSessionBindTest implements HttpSessionBindingListener {private int count;//记录session的数量public int getCount() {return count;}public HttpSessionBindTest() {}//监听session的创建public void valueBound(HttpSessionBindingEvent sce)  { //登录System.out.println("登录 value Bound");count++;}//监听session的撤销public void valueUnbound(HttpSessionBindingEvent sce)  { //退出System.out.println("退出 value Unbound");count--;}}

2.上下文属性监听类ServletContextListenerTest

package com.iflytek.xxsystem.listener;import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class ServletContextListenerTest implements ServletContextListener {public ServletContextListenerTest() {// TODO Auto-generated constructor stub}@Overridepublic void contextInitialized(ServletContextEvent sce) {//设置application的count属性HttpSessionBindTest sessionbinder = new HttpSessionBindTest();sce.getServletContext().setAttribute("counter",sessionbinder);}@Overridepublic void contextDestroyed(ServletContextEvent sce) {}}

二.servlet处理数据

1.登陆及监听数据处理

package com.aiit.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;/*** Servlet implementation class doBusinessServlet*/
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {private static final long serialVersionUID = 1L;public LoginServlet() {super();}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String user=request.getParameter("user");String pwd = request.getParameter("pwd");//设置session过期时间1分钟//request.getSession().setMaxInactiveInterval(10);if(user.equals(pwd)) {request.getSession().setAttribute("user", user);//找到唯一的bindlisten对象Object counter = request.getServletContext().getAttribute("counter");//把listener设置成sessionrequest.getSession().setAttribute("usercount", counter);request.getRequestDispatcher("main.jsp").forward(request, response);}else {response.sendRedirect("Login.jsp");}}}

2.退出销毁对象处理

package com.aiit.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;@WebServlet("/TuichuServlet")
public class TuichuServlet extends HttpServlet {private static final long serialVersionUID = 1L;public TuichuServlet() {super();// TODO Auto-generated constructor stub}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//销毁sessionrequest.getSession().invalidate();response.sendRedirect("Login.jsp");}   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}

三、前台JSP

1.登陆界面

<%@ page language="java" contentType="text/html; charset=UTF-8"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>员工登录界面</title>
</head>
<body><h3>登录到HR系统</h3><h1 style="color: red;"></h1><form action="LoginServlet" method="post"><table><tr><td>员工编号:</td><td><input type="text" name="user" value="" /></td></tr><tr><td>系统密码:</td><td><input type="password" name="pwd" value="" /></td></tr><tr><td colspan="2"><input type="submit" value="提交" /></td></tr></table></form></body>
</html>

2.主界面

<%@ page language="java" contentType="text/html; charset=UTF-8"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>欢迎${user}登录 <br><font color="red">在线人数${applicationScope.counter.count}</font><br><a href="TuichuServlet">退出登录</a>
</body>
</html>

效果展示:

JavaWeb监听器简单介绍及一个登陆监听案例相关推荐

  1. java监听com口_简单了解Java接口+事件监听机制

    1.接口: 定义方法: public interface interName //extends interName2, interName3...可继承多个接口 在接口里只能定义常量和抽象方法. p ...

  2. 服务器动态上下线监听案例

    服务器动态上下线监听案例 文章目录 1.需求 2.需求分析 3.编程实现 1.先在集群上创建/servers节点 2.服务器端向Zookeeper注册代码(Server) 3.客户端代码(Client ...

  3. Gmapping从开始到放弃—写一个TF 监听

    这篇文章主要 记录如何监听一个TF广播,通过监听tf,我们可以避免繁琐的旋转矩阵的计算,而直接获取我们需要的相关信息.当然也是接着上一篇文章创建的开发包继续走下去 (1)在my_tf文件下的src下新 ...

  4. android rxbus 一个页面监听,Android RxBus的使用

    RxBus的核心功能是基于Rxjava的,在RxJava中有个Subject类,它继承Observable类,同时实现了Observer接口,因此Subject可以同时担当订阅者和被订阅者的角色,这里 ...

  5. Day2多种抓包工具介绍以及使用封包监听工具找到挑战数据包实现发送数据包进行挑战

    工具相关证书安装指南 Charles https://blog.csdn.net/weixin_45459427/article/details/108393878 Fidder https://bl ...

  6. android音乐播放器监听器,android 音乐播放器电话监听

    正好用到整理下 首先 添加 权限 电话监听 /** * * @author xiaoma * 电话监听器类 */ private class MobliePhoneStateListener exte ...

  7. python多进程关闭socket_用Python制作一个多进程UDP服务器,一个进程监听一个p

    我想用Python制作一个多进程UDP服务器,从一个类中为每个进程监听一个端口: processListener.py:import multiprocessing import socket cla ...

  8. C# Socket系列一 简单的创建socket的监听

    socket的应用场景,在快速,稳定,保持长连接的数据传输代码.Http也是socket封装出来的,基于一次请求一次回复,然后断开的socket连接封装. 比如我们常见的游戏服务器,目前的很火的物联网 ...

  9. java hook jna鼠标_JNA介绍及使用JNA监听鼠标实现

    Java本身是没有提供直接访问系统的API方法,查了下资料,要实现鼠标钩子有3种方法, 1.使用JNI方法,需要自己写C实现,比较复杂. 2.使用swt extension,直接提供了鼠标钩子的实现, ...

最新文章

  1. 不讲CRUSH的Ceph教程是不完整的
  2. 构造函数和析构函数中抛出异常
  3. XCTF-MISC-新手区:pdf
  4. 洛杉矶手机资费9.9美元包打一年
  5. Wpf控件ListBox使用实例2
  6. java fx choicebox_JavaFX:具有图像和文本的ChoiceBox
  7. iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  8. 图片类关于实现图片剪切功能的相关类的学习心得
  9. TCP/IP review之 静态路由
  10. 大厂前端必备技能Webpack原理剖析
  11. 用c语言编写五子棋用vs写,c语言写的五子棋人与人对战
  12. hmcl手机版_hmcl启动器手机版软件下载-我的世界hmcl启动器官网版最新下载v3.3.159-飘荡下载...
  13. 基于置信加权池的全卷积保证颜色恒常性
  14. 多重选定怎么撤销_怎样取消电脑多重网络 - 卡饭网
  15. re学习笔记(25)BUUCTF-re-[2019红帽杯]easyRE
  16. 安卓的数据共享——从一个APP中调用另一个APP数据的方法
  17. ssm+bootsrap人力资源考勤系统-JAVA【数据库设计、源码、开题报告】
  18. 更换固态,重装win10系统
  19. gateway使用教程
  20. MySQL:记录一个多对多小查询

热门文章

  1. 凯瑞老师丨社交电商下半场,开启精准投喂式销售,社群营销重归
  2. 什么是施密特触发器?
  3. 新加坡计算机博士雅思要求,【新加坡国立大学】我想请问一下,想申请新加坡国立大学博士,雅思成绩基本要求是多少?-选校帝...
  4. 好消息!95号汽油进入7元时代
  5. python保存图片并命名_python 获取图片并自动命名保存
  6. MySQL Workbench 8.0.13 汉化包
  7. Cadence PCB导入网表时 总是显示找不到封装
  8. PS2018使用过程中出现“要求96和8之间的整数”弹出报错解决办法。
  9. S2D 真实机房生产环境运维排错
  10. Socket断线重连