第三十七节(java-开发流量分析统计系统)

User.java文件里:

package com.tanzhou.util;

import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

/**
 * 用户对象
 *
 * @author Ming
 * @version 1.0
 * 2015-2-7
 *
 *实现了HttpSessionBindingListener接口,就会把user对象绑定到session中,或者从
 *session移除掉
 */
public class User implements HttpSessionBindingListener{

    private String name; // 用户名

    public User(String uname){
        super();
        this.name = uname;
    }

    //得到UserList的实例
    private UserList ul =UserList.getInstance();

    /**
     * 用户登陆---User -- session(将user绑定到session)-自动调用valueBound
     */
    public void valueBound(HttpSessionBindingEvent arg0) {
        ul.addUser(name); //添加用户
    }

    /**
     * 用户退出---User -- session(将user绑定到session)-自动调用valueUnbound
     */
    public void valueUnbound(HttpSessionBindingEvent arg0) {
        ul.removeUser(name);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

///////////////////////////////////////////////////////////////////////
UserList.java文件里:

package com.tanzhou.util;

import java.util.Vector;

/**
 * 装载用户的容器类
 * @author Ming
 * @version 1.0
 * 2015-2-7
 *
 *
 *单例模式:是指一个类只有一个实例。
 *单例模式的特点:
 *1、单例类只能有一个实例
 *2、单例类必须自己创建自己的唯一实例
 *3、单例必须给所有其他对象那个提供这一实例
 *
 */
public class UserList {
    // List下的实现类, 装载登陆用户的容器
    private Vector<String> vector;

    // 自己创建自己的唯一实例
    private static final UserList  userList = new UserList();

    // 提供私有的无参构造函数
    private UserList() {
        vector = new Vector<String>();
    }

    /**
     * 对外提供访问的入口
     * @return
     */
    public static UserList getInstance(){
        return userList;
    }

    /**
     * 向集合中添加用户
     * @param name 登陆进来的用户名
     */
    public void addUser(String name) {
        if(name!=null){
            vector.add(name);
        }
    }

    /**
     * 退出后,在容器里把该用户移除掉
     * @param name 退出的用户名
     */
    public void removeUser(String name){
        if(name!=null){
            vector.remove(name);
        }
    }

    /**
     * 统计用户列表
     * @return 用户列表
     */
    public Vector<String> getUserList() {
        return vector;
    }

    /**
     * 获得用户的数量
     * @return
     */
    public int getUserCount() {
        return vector.size();
    }
}

///////////////////////////////////////////////////////////////
UserList.jsp文件里:

<%@ page language="java" import="java.util.*,com.tanzhou.util.*" pageEncoding="gbk"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

// 获取用户名,并且处理编码集
    String name = new String(request.getParameter("username").getBytes("ISO-8859-1"),"gbk");

    if(name==null || "".equals(name)){
        response.sendRedirect("index.jsp");
    }else{
        User user = (User)session.getAttribute("user");

        if(user==null || !name.equals(user.getName())){
            user = new User(name);
            session.setAttribute("user", user);
        }
    }
    UserList ul = UserList.getInstance();  // 获得UserList对象
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>用户列表</title>

  </head>

  <body>
     <table align="center" width="70%" style="background-color:#D5FFFF;text-align:center;font-size:14px">
         <tr>
             <td><b>欢迎【<%=name %>】登陆!</b></td>
         </tr>
         <tr>
             <td style="color:red">在线人数:<%=ul.getUserCount() %></td>
         </tr>
         <tr>
             <td height="100px">
                 <%
                 Vector<String> vector = ul.getUserList(); // 获取到容器
                 int i=0;
                 // Enumeration 列举类型
                 Enumeration<String> enums = vector.elements();
                 while(enums.hasMoreElements()){
                     out.println(enums.nextElement()); // 打印出来这个值
                     out.println("&nbsp;&nbsp;&nbsp;");
                     if((++i%8)==0){
                         out.println("<br />");
                     }
                 }
                 %>
             </td>
         </tr>
         <tr>
             <td><a href="exit.jsp">退出登陆</a></td>
         </tr>
     </table>
  </body>
</html>

/////////////////////////////////////////////////////////////////
exit.jsp文件里:

<%@ page language="java" import="java.util.*,com.tanzhou.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

response.setContentType("text/html");
User user = (User)session.getAttribute("user");
session.invalidate(); // session销毁
response.sendRedirect("index.jsp");
%>

///////////////////////////////////////////////////////////
index.jsp文件里:

<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>登陆界面</title>

  </head>

  <body>
     【用户登陆页面<br />
     <form action="UserList.jsp" method="POST">
         用户名: <input type="text" name="username" /><br />
         密码:<input type="password" name="password" /><br />
         <input type="submit" value="登陆">
     </form>
  </body>
</html>
时间: 2024-10-12 12:39:08

第三十七节(java-开发流量分析统计系统)的相关文章

centos shell编程3【告警系统】 第三十七节课

centos shell编程3[告警系统]  第三十七节课 上半节课 下半节课 整个项目没有任何架构,都是单机的,没有服务器端和客户端的概念只是简单调用一下shell脚本,子shell,通过添加更多的shell脚本扩展功能 mail.sh:做邮件收敛uptime或w 获取load average 需要安装php环境yum install -y php 需求: 使用shell定制各种个性化告警工具,但需要统一化管理.规范化管理. 思路:指定一个脚本包,包含主程序.子程序.配置文件.邮件引擎.输出日

第三百三十七节,web爬虫讲解2—PhantomJS虚拟浏览器+

第三百三十七节,web爬虫讲解2-PhantomJS虚拟浏览器+selenium模块操作PhantomJS PhantomJS虚拟浏览器 phantomjs 是一个基于js的webkit内核无头浏览器 也就是没有显示界面的浏览器,利用这个软件,可以获取到网址js加载的任何信息,也就是可以获取浏览器异步加载的信息 下载网址:http://phantomjs.org/download.html  下载对应系统版本 下载后解压PhantomJS文件,将解压文件夹,剪切到python安装文件夹 然后将P

Android内核开发:如何统计系统的启动时间

本文是<Android内核开发>系列的第七篇文章,通过上一篇文章<Android内核开发:图解Android系统的启动过程>我们大致了解了Android系统的启动过程,那么本文就从实践的角度,简单介绍一下如何统计Android系统的启动时间. 这里所说的统计系统的启动时间,并不是简单地用秒表和肉眼来统计,而是通过分析系统输出的log信息来统计,这样才显得更加专业. 首先了解2个概念: (1) Android是基于Linux内核的系统,因此Android的启动过程是分为两个阶段的,第

第三十七节、人脸检测MTCNN和人脸识别Facenet

在说到人脸检测我们首先会想到利用Harr特征提取和Adaboost分类器进行人脸检测(有兴趣的可以去一看这篇博客第九节.人脸检测之Haar分类器),其检测效果也是不错的,但是目前人脸检测的应用场景逐渐从室内演变到室外,从单一限定场景发展到广场.车站.地铁口等场景,人脸检测面临的要求越来越高,比如:人脸尺度多变.数量冗大.姿势多样包括俯拍人脸.戴帽子口罩等的遮挡.表情夸张.化妆伪装.光照条件恶劣.分辨率低甚至连肉眼都较难区分等.在这样复杂的环境下基于Haar特征的人脸检测表现的不尽人意.随着深度学

[extjs5学习笔记]第三十七节 Extjs6预览版都有神马新东西

本文在微信公众号文章地址:微信公众号文章地址 本文地址:http://blog.csdn.net/sushengmiyan/article/details/45190485 [TOC] 在Ext JS 6,可以使用单一的javascript框架来无缝的创建基于桌面.平板和智能手机的应用程序. ExtJS 6 早期版本发布,新增功能如下: 合并了 Ext JS 和 Sencha Touch 功能 通过 Sencha Cmd 6,新增时尚主题功能 3D 绘图功能增强 默认Ext JS 网格辅助选项为

第二百三十七节,Bootstrap图标菜单按钮组件

Bootstrap图标菜单按钮组件 学习要点: 1.小图标组件 2.下拉菜单组件 3.按钮组组件 4.按钮式下拉菜单 本节课我们主要学习一下 Bootstrap 的三个组件功能:小图标组件.下拉菜单组件和各 种按钮组件. 一.小图标组件 Bootstrap 提供了免费的 263 个小图标(数了两次),具体可以参考中文官网的组件 链接:http://v3.bootcss.com/components/#glyphicons.

第三课:java开发hdfs

(1)关于hdfs小结 hadoop由hdfs + yarn + map/reduce组成, hdfs是数据库存储模块,主要由1台namenode和n台datanode组成的一个集群系统, datanode可以动态扩展,文件根据固定大小分块(默认为128M), 每一块数据默认存储到3台datanode,故意冗余存储,防止某一台datanode挂掉,数据不会丢失. HDFS = NameNode + SecondaryNameNode + journalNode + DataNode hdfs的典

(三十七)Android开发中修改程序字体

1.在Android XML文件中设置系统默认的字体 可以在XML文件中采用android:typeface设置字体,例如android:typeface=”monospace”.在这里例子中我们在Activity中对android:text=”Hello, World! 您好”分别进行了四种显示方式,依次为“Sans”,“serif”,“monospace”和系统缺省方式(经试验缺省采用采用sans).英文字体有差异,貌似中文字体没有差异.XML文件如下: <?xml version=“1.0

I学霸官方免费教程三十七:Java数据结构之单向链表结构

数据结构之单向链表 例如:现有双向链表OneWayLinked中存储着1,2,3,4四个元素,那么集合对象中会有4个节点A.B.C.D,由上述结构可以知道,节点A中存储着元素1和节点B:节点B中存储着元素2和节点C,节点C中存储着元素3和节点D,节点D中存储着元素4和null.如果现在要在元素2和3中间插入一个元素5:过程如下:1.创建节点E,E中存储元素52.将B中的下一个节点修改为节点E3.将E中的下一个节点赋值为节点C从上述过程看,插入时没有节点位置移动的操作,所以效率比较高:删除的过程和