监听器(web基础学习笔记二十二)
一、监听器
监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。监听器其实就是一个实现特定接口的普通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基础学习笔记二十二)的更多相关文章
- Python基础学习笔记(十二)文件I/O
参考资料: 1. <Python基础教程> 2. http://www.runoob.com/python/python-files-io.html ▶ 键盘输入 注意raw_input函 ...
- python基础学习笔记(十二)
模块 前面有简单介绍如何使用import从外部模块获取函数并且为自己的程序所用: >>> import math >>> math.sin(0) #sin为正弦函数 ...
- VSTO 学习笔记(十二)自定义公式与Ribbon
原文:VSTO 学习笔记(十二)自定义公式与Ribbon 这几天工作中在开发一个Excel插件,包含自定义公式,根据条件从数据库中查询结果.这次我们来做一个简单的测试,达到类似的目的. 即在Excel ...
- 汇编入门学习笔记 (十二)—— int指令、port
疯狂的暑假学习之 汇编入门学习笔记 (十二)-- int指令.port 參考: <汇编语言> 王爽 第13.14章 一.int指令 1. int指令引发的中断 int n指令,相当于引 ...
- Binder学习笔记(十二)—— binder_transaction(...)都干了什么?
binder_open(...)都干了什么? 在回答binder_transaction(...)之前,还有一些基础设施要去探究,比如binder_open(...),binder_mmap(...) ...
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- salesforce 零基础学习(五十二)Trigger使用篇(二)
第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. ...
- Android学习笔记(十二)——实战:制作一个聊天界面
//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 运用简单的布局知识,我们可以来尝试制作一个聊天界面. 一.制作 Nine-Patch 图片 : Nine-Pa ...
随机推荐
- Windows Azure 系列-- Azure Queue的操作
- Storage Account. 和之前介绍的Azure Table和AzureBlob一样.你须要一个StorageAccount,仅仅须要创建1次AzureStorageAccount就好了, ...
- HowTo: Restart SSH Service under Linux / UNIX
How do I restart SSH service under Linux or UNIX operating systems? The command to restart ssh are a ...
- Go 收藏
Golang 定位解决分布式系统,服务器应用开发,主要竞争对手是 Java.Python 之类:Rust 定位解决单机安全问题,高性能场景偏系统底层开发,主要竞争对手就是 C 和 C++. Golan ...
- 用最简单的例子理解观察者模式(Observer Pattern)
假设有一个软件公司,每当有新产品推出,就把信息通知到一些客户. 把通知这个动作抽象成一个接口. public interface IService { void Notif(); } 客户如果想获得通 ...
- 利用UIWebView获取userAgent需要注意的地方
网络通信有时候需要传递参数userAgent,iOS中获取userAgent很简单. UIWebView* webView = [[UIWebView alloc] initWithFrame:CGR ...
- Java遍历Map键、值。获取Map大小的方法
Map读取键值对,Java遍历Map的两种实现方法 第一种方法是根据map的keyset()方法来获取key的set集合,然后遍历map取得value的值 import java.util.HashM ...
- opencv cuda TK1 TX1 兼容设置
cmake设置 CUDA_ARCH_BIN 3.2 5.2 CUDA_ARCH_PTX 3.2 5.2 否则报一下错误: OpenCV Error: Gpu API call (NCV Asserti ...
- Common Internet File System
CIFS (Common Internet File System) is a protocol that gained popularity around the year 2000, as ven ...
- sql的嵌套查询,把一次查询的结果做为表继续进一步查询;内联视图
Mysql的嵌套表查询 嵌套SELECT语句也叫子查询,一个 SELECT 语句的查询结果能够作为另一个语句的输入值.子查询可以: 出现在Where子句中, 出现在from子句中,作为一个临时表使用, ...
- Spring 远程服务
稍微看了一下Spring的远程服务章节,讲到了RMI,Hessian,Burlap,Http invoker以及JAX-WS 1.RMI 原理: 1)在Spring服务端使用RmiServiceExp ...