第三十一节(java-实现QQ空间访问量统计系统)

LoginServlet登录页面:

package com.tanzhou.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;

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.tanzhou.util.User;
import com.tanzhou.util.UserList;

public class LoginServlet extends HttpServlet {

    public LoginServlet() {
        super();
    }

    public void destroy() {
        super.destroy(); // Just puts "destroy" string in log
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

           doPost(request,response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=utf-8");
        
        String name = getNewString(request.getParameter("username"));
        String pass = request.getParameter("userpass");
        
        if(name==null || "".equals(name)){
            response.sendRedirect("/OnlineUserDemo/login.html");
            return ;
        }else{
            
            // 讲登录的用户名和密码保存到session中
            HttpSession session = request.getSession(true);
            
            // 保存对象到session
            User user = (User)session.getAttribute("user");
            if(user==null || !name.equals(user.getName())){
                user = new User(name);
                session.setAttribute("user", user);
            }
        }
        
        PrintWriter out = response.getWriter();
        out.println("欢迎用户:"+name+"登录"+"<br/>");
        out.println("<hr>"+"在线人数列表:"+"<br/>");
        UserList ul = UserList.getInstance();
        /**
         * Enumeration(列举)
         */
        Enumeration<String> enums = ul.getUserList();
        int i = 0;
        while(enums.hasMoreElements()){
            out.println(enums.nextElement()); // 遍历出来的用户信息
            out.println("&nbsp;&nbsp;&nbsp;");
            if((++i%8)==0){
                out.println("<br>");
            }
        }
        out.println("<hr>");
        out.println("<br>"+"在线人数:"+ul.getUserCount());
        out.println("<br>"+"<a href='/OnlineUserDemo/servlet/OutServlet'>退出登录</a>");
        out.flush();
        out.close();
    }

    public void init() throws ServletException {
    }
   /**
    * 编码集处理
    * @param str
    * @return
    * @throws UnsupportedEncodingException
    */
    public static String getNewString(String str) throws UnsupportedEncodingException
    {
        return new String(str.getBytes("ISO-8859-1"),"UTF-8");
    }
}


OutServlet退出页面:

package com.tanzhou.servlet;

import java.io.IOException;
import java.io.PrintWriter;

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.tanzhou.util.User;

public class OutServlet extends HttpServlet {

    /**
     * Constructor of the object.
     */
    public OutServlet() {
        super();
    }

    /**
     * Destruction of the servlet. <br>
     */
    public void destroy() {
        super.destroy(); // Just puts "destroy" string in log
        // Put your code here
    }

    
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doPost(request,response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        
        HttpSession session = request.getSession(true);
        User user = (User)session.getAttribute("user");
        
        session.invalidate(); // session销毁
        response.sendRedirect("/OnlineUserDemo/login.html");
    }

    /**
     * Initialization of the servlet. <br>
     *
     * @throws ServletException if an error occurs
     */
    public void init() throws ServletException {
        // Put your code here
    }

}


User页面:
package com.tanzhou.util;

import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
/**
 * 
 * @author Tony Liu
 *
 *
 *如果一个对象实现了HttpSessionBindingListener接口,当这个对象被绑定到session中或者从session中被删除时,
 *Servlet容器会通知该对象。
 */
public class User implements HttpSessionBindingListener{
    // 得到UserList的实例
    private UserList ul = UserList.getInstance();
    private String name;
    
    public User(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    /**
     * session创建对象--自动调用valueBound     用户登录
     */
    @Override
    public void valueBound(HttpSessionBindingEvent arg0) {
        ul.addUser(name);  // 添加用户
    }
    /**
     * session销毁--自动调用valueUnbound  用户退出
     */
    @Override
    public void valueUnbound(HttpSessionBindingEvent arg0) {
        ul.removeUser(name);  //删除用户
    }
    
    
}


UserList页面:

package com.tanzhou.util;

import java.util.Enumeration;
import java.util.Vector;

/**
 * 用户集合类
 * @author Ming
 *
 *
 *
 * 单例模式---是指一个类只有一个实例,并且能够自行的实例化
 * 特点:构造方法是私有
 * 
 * 单例模式:懒汉式单例  饿汉式单例   登记式单例
 * 特点:
 *   1、单例类只能有一个实例
 *   2、单例类必须自己创建自己的唯一实例
 *   3、单例类必须给所有其他对象提供这一实例
 */
public class UserList {

    private static final UserList userList = new UserList();
    /**
     * List 接口一共有三个 ArrayList  Vector  LinkedList
     */
    private Vector<String> v; //用户集合
    
    private UserList(){
        v = new Vector<String>();
    }
    
    public static UserList getInstance(){
        return userList;
    }
    /**
     * 用户登录-添加用户信息
     * @param name
     */
    public void addUser(String name){
        if(name!=null){
            v.addElement(name);
        }
    }
    
    /**
     * 用户退出的方法
     * @param anme
     */
    public void removeUser(String name){
        if(name!=null){
            v.remove(name);
        }
    }
    /**
     * 用户数量的统计
     * @return
     */
    public int getUserCount(){
        return v.size();
    }
    /**
     * Enumeration (列举)
     * @return
     */
    public Enumeration<String> getUserList(){
        return v.elements();
    }
}
原文地址:https://www.cnblogs.com/Deng1185246160/p/4279730.html