一、监听器

监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法立即被执行。

二、监听器统计在线人数--HttpSessionListener实现

package com.pb.news.listenter;

public class OnlineCounter {
public static long ONLINE_USER_COUNT=0;
public static long getonline(){
return ONLINE_USER_COUNT;
} public static void raise() {
ONLINE_USER_COUNT++;
} public static void reduce() {
ONLINE_USER_COUNT--;
}
}
package com.pb.news.listenter;

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener; /**
* Application Lifecycle Listener implementation class OnlineCounterListener
*
*/
public class OnlineCounterListener implements HttpSessionListener { /**
* @see HttpSessionListener#sessionCreated(HttpSessionEvent)
*/
public void sessionCreated(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
//session创建里用户加1
OnlineCounter.raise();
} /**
* @see HttpSessionListener#sessionDestroyed(HttpSessionEvent)
*/
public void sessionDestroyed(HttpSessionEvent arg0) {
//session销毁里里用户减1
OnlineCounter.reduce();
} }

只需要在页面中写入

在线人数:<%=OnlineCounter.getonline() %>

三、监听器统计在线人数--HttpSessionBindingListener实现绑定用户登录查询在线人数

创建静态变量类

package com.pb.news.constants;

public class Constants {
//统计在线人线人数静态常量
public static int ONLINE_USER_COUNT=0;
}

创建用户类来实现-接口-HttpSessionBindingListener

package com.pb.news.listenter;

import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener; import com.pb.news.constants.Constants; /**
* Application Lifecycle Listener implementation class UserLoginCount
*
*/
public class UserLoginCount implements HttpSessionBindingListener {
private int id; //用户id;
private String username; //用户姓名
private String password; //用户密码
private String email; //用户邮箱
private int usertype; //用户类型 //getter和setter方法
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getUsertype() {
return usertype;
}
public void setUsertype(int usertype) {
this.usertype = usertype;
} /**
* Default constructor.
*/
public UserLoginCount() {
// TODO Auto-generated constructor stub
} /**
* @see HttpSessionBindingListener#valueBound(HttpSessionBindingEvent)
*/
public void valueBound(HttpSessionBindingEvent arg0) {
Constants.ONLINE_USER_COUNT++;
} /**
* @see HttpSessionBindingListener#valueUnbound(HttpSessionBindingEvent)
*/
public void valueUnbound(HttpSessionBindingEvent arg0) {
Constants.ONLINE_USER_COUNT--;
} }

创建登录servlet类

package com.pb.news.web.servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import com.pb.news.dao.impl.UsersDaoImpl;
import com.pb.news.entity.Users;
import com.pb.news.listenter.UserLoginCount;
import com.pb.news.service.impl.UsersServiceImpl; /**
* Servlet implementation class UserLoginServlet
*/
public class UserLoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L; /**
* @see HttpServlet#HttpServlet()
*/
public UserLoginServlet() {
super();
// TODO Auto-generated constructor stub
} /**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
} /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//request.setCharacterEncoding("utf-8");
String username=request.getParameter("username");
String password=request.getParameter("password");
UsersServiceImpl usersService=new UsersServiceImpl();
UsersDaoImpl usersDao=new UsersDaoImpl();
usersService.setUsersDao(usersDao);
boolean flag=usersService.login(username, password);
if(flag==true){
//request.getSession().setAttribute("user", username);
//创建HttpSessio对象
/*Users users=new Users();
users.setUsername(username);
users.setPassword(password);*/
UserLoginCount users= new UserLoginCount();
users.setUsername(username);
users.setPassword(password);
HttpSession s=request.getSession();
s.setAttribute("user", users);
//s.setAttribute("pwd", password);
//request.getRequestDispatcher("jsp/index.jsp").forward(request, response);
response.sendRedirect("jsp/index.jsp"); }else{
request.setAttribute("msg", "用户名或者密码不正确");
RequestDispatcher rd=request.getRequestDispatcher("jsp/userLogin.jsp");
rd.forward(request, response);
//request.getRequestDispatcher("jsp/userLogin.jsp").forward(request, response);
//response.sendRedirect("jsp/userLogin.jsp");
} } }

在要显示的页面显示

已登录用户:<%=com.pb.news.constants.Constants.ONLINE_USER_COUNT %> 

相比较,第一种更简洁,这里可能还有理简单的输出,暂时没发现

四、监听器统计在线人数--HttpSessionListener实现

package com.pb.news.web.servlet;

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener; public class UserCountListener implements HttpSessionListener {
private int count = 0; public void sessionCreated(HttpSessionEvent se) {
// TODO Auto-generated method stub
//人数加1
count++;
setContext(se); } public void sessionDestroyed(HttpSessionEvent se) {
// TODO Auto-generated method stub
//人数减1
count--;
setContext(se); }
private void setContext(HttpSessionEvent se){
se.getSession().getServletContext().setAttribute("userCount",new Integer(count));
} }
创建UserCountListener监听器,注意web.xml中要有:
<listener>
<listener-class>com.pb.news.web.servlet.UserCountListener</listener-class>
</listener> 创建监听器后,可以在需要显示人数的页面加入下面的语句:
Object userCount=session.getServletContext().getAttribute("userCount");
out.print(userCount.toString());

五、不需要登录统计在线人数

package com.pb.listenter;

import javax.servlet.ServletContext;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener; /**
* Application Lifecycle Listener implementation class CountListenter
*
*/
@WebListener
public class CountListenter implements HttpSessionListener {
//private int count=0;
/**
* Default constructor.
*/
public CountListenter() {
// TODO Auto-generated constructor stub
} /**
* 创建seesion+1
*/
public void sessionCreated(HttpSessionEvent se) {
// TODO Auto-generated method stub
ServletContext context=se.getSession().getServletContext();
Integer count=(Integer) context.getAttribute("count");
if(count==null){
//count=new Integer(1);
context.setAttribute("count", 1);
}else{
count++;
context.setAttribute("count", count);
} } /**
* 销毁session时次数-1
*/
public void sessionDestroyed(HttpSessionEvent se) {
// TODO Auto-generated method stub
ServletContext context=se.getSession().getServletContext();
Integer count=(Integer) context.getAttribute("count");
count--;
context.setAttribute("count", count); } }

在需要显示的页面输入以下代码显示

<%
ServletContext context=session.getServletContext();
Integer count=(Integer)context.getAttribute("count");
%>
  <%=count%>

监听器(web基础学习笔记二十二)的更多相关文章

  1. Python基础学习笔记(十二)文件I/O

    参考资料: 1. <Python基础教程> 2. http://www.runoob.com/python/python-files-io.html ▶ 键盘输入 注意raw_input函 ...

  2. python基础学习笔记(十二)

    模块 前面有简单介绍如何使用import从外部模块获取函数并且为自己的程序所用: >>> import math >>> math.sin(0) #sin为正弦函数 ...

  3. VSTO 学习笔记(十二)自定义公式与Ribbon

    原文:VSTO 学习笔记(十二)自定义公式与Ribbon 这几天工作中在开发一个Excel插件,包含自定义公式,根据条件从数据库中查询结果.这次我们来做一个简单的测试,达到类似的目的. 即在Excel ...

  4. 汇编入门学习笔记 (十二)—— int指令、port

    疯狂的暑假学习之  汇编入门学习笔记 (十二)--  int指令.port 參考: <汇编语言> 王爽 第13.14章 一.int指令 1. int指令引发的中断 int n指令,相当于引 ...

  5. Binder学习笔记(十二)—— binder_transaction(...)都干了什么?

    binder_open(...)都干了什么? 在回答binder_transaction(...)之前,还有一些基础设施要去探究,比如binder_open(...),binder_mmap(...) ...

  6. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  7. MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  8. salesforce 零基础学习(五十二)Trigger使用篇(二)

    第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. ...

  9. Android学习笔记(十二)——实战:制作一个聊天界面

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 运用简单的布局知识,我们可以来尝试制作一个聊天界面. 一.制作 Nine-Patch 图片 : Nine-Pa ...

随机推荐

  1. gulp编译出现Cannot find module 'internal/util/types'——node环境的变更

    一心埋头敲代码,再回首,nodejs都蹦跶到8.9版本了,为了跟上时代,妥妥的赶紧升级啊,升级的结果...Cannot find module 'internal/util/types'...   于 ...

  2. Backup your Android without root or custom recovery -- adb backup

    ecently discovered a neat new way to back up apps on my Android without having to use Titanium Backu ...

  3. PWM DAC vs. Standalone

    http://analogtalk.com/?p=534 http://analogtalk.com/?p=551 Posted by AnalogAdvocate on April 09, 2010 ...

  4. H5页面开发笔记(react技术栈)

    1.子组件接收父组件的参数,要在子组件的componentDidMount函数中更改当前组件的state,若写在componentWillMount函数中,则会导致初始化界面UI的时候不能得到预期的效 ...

  5. UITableView 让 cell 被选中的颜色底色快速消失,而不是一直停留在cell上

    //单元格被选中 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath ...

  6. 转: Go -- 单例

    最近在学习Golang,想着可以就以前的知识做一些串通,加上了解到go语言也是面向对象编程语言之后.在最近的开发过程中,我碰到一个问题,要用go语言实现单例模式.本着“天下知识,同根同源”(我瞎掰的~ ...

  7. UIScrollView视差模糊效果

    UIScrollView视差模糊效果 效果 源码 https://github.com/YouXianMing/Animations // // ScrollBlurImageViewControll ...

  8. Oracle中索引的使用 索引性能优化调整

    索引是由Oracle维护的可选结构,为数据提供快速的访问.准确地判断在什么地方需要使用索引是困难的,使用索引有利于调节检索速度. 当建立一个索引时,必须指定用于跟踪的表名以及一个或多个表列.一旦建立了 ...

  9. Android图片加载框架最全解析(二),从源码的角度理解Glide的执行流程

    在本系列的上一篇文章中,我们学习了Glide的基本用法,体验了这个图片加载框架的强大功能,以及它非常简便的API.还没有看过上一篇文章的朋友,建议先去阅读 Android图片加载框架最全解析(一),G ...

  10. Ceph rgws客户端验证

    修改/etc/ceph/ceph.conf文件,加入rados gw监听的端口 [client.rgw.rgws] rgw_frontends = "civetweb port=80&quo ...