AJAX练习之时时更新的计数器

来源:互联网 发布:医院网络咨询好做吗 编辑:程序博客网 时间:2024/04/29 23:34

--显示页面 index.jsp

<%@ page language="java" pageEncoding="GB18030"%>
<html><head><script type='text/javascript' src="webapp.js"></script>
<script type='text/javascript'>window.setInterval("OnlineState()", 1000);</script>
</head><body onbeforeunload="LeaveState()">
 <h1>Web 计数器</h1>
  <div id="showCounter"></div>
</body></html>

--JavaScript脚本文件 webapp.js

var httpRequest;
var requestURL = "servlet/CounterServlet";
//上线
function OnlineState() {
 httpRequest = getHTTPRequestObject();
 httpRequest.onreadystatechange = manageData;
 //httpRequest.open("GET", requestURL, true);
 //httpRequest.send(null);
 httpRequest.open("POST", requestURL, true);
 httpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
 httpRequest.send("state=" + 1);
}
//离线
function LeaveState() {
 httpRequest = getHTTPRequestObject();
 httpRequest.onreadystatechange = manageData;
 httpRequest.open("POST", requestURL, true);
 httpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
 httpRequest.send("state=" + 0);
}
//
function manageData() {
 if (httpRequest.readyState == 4) {
  if (httpRequest.status == 200) {
   try {
    document.getElementById("showCounter").innerText = httpRequest.responseText;
   }
   catch (e) {
   }
  } else {
   if (httpRequest.status == 404) {
    alert("Can't find file....");
   } else {
    alert("error..." + httpRequest.status);
   }
  }
 } else {
  document.getElementById("showCounter").innerHTML = "Wait a moment...";
 }
}
//
function getHTTPRequestObject() {
 var httpRequestObject;
 if (window.XMLHttpRequest) { //非微软浏览器
  httpRequestObject = new XMLHttpRequest();
 } else {
  if (window.ActiveXObject) { // IE
   try {
    httpRequestObject = new ActiveXObject("Msxml2.XMLHTTP");
   }
   catch (e) {
    try {
     httpRequestObject = new ActiveXObject("Microsoft.XMLHTTP");
    }
    catch (e2) {
     alert("Your Explorer has some errors!");
    }
   }
  }
 }
 return httpRequestObject;
}

--计数类 Counter.java

package org.xiosu.ajaxcounter.util;
/**
 * 计数类,采用单例模式
 */
public class Counter {
 private static Counter oneCounter;
 // 初始为3000
 private static int onlineCounter = 3000;
 private Counter() {
 }
 // 获取惟一实例
 public static Counter getInstance() {
  if (oneCounter == null)
   oneCounter = new Counter();
  return oneCounter;
 }
 public static int getOnlineCounter() {
  return onlineCounter;
 }
 public static void oneCome() {
  onlineCounter++;
 }
 public static void oneLeave() {
  onlineCounter--;
 }
}

--监听器类 CounterListener.java

package org.xiosu.ajaxcounter.listener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import org.xiosu.ajaxcounter.util.*;
/**
 * 监听器类,只是监听了session的产生与失效
 */
public class CounterListener implements HttpSessionListener {
 Counter counter = Counter.getInstance();
 //
 public void sessionCreated(HttpSessionEvent arg0) {
  counter.oneCome();
 }
 //
 public void sessionDestroyed(HttpSessionEvent arg0) {
  counter.oneLeave();
 }
}

--主控制类 CounterServlet.java

package org.xiosu.ajaxcounter.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 org.xiosu.ajaxcounter.util.*;
/**
 * 主控制类
 * */
public class CounterServlet extends HttpServlet {
 //
 public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  response.setContentType("text/html");
  // 获取请求
  String state = request.getParameter("state");
  if (state == null)
   state = "-1";
  int isOnline = Integer.parseInt(state);
  // 0代表离线
  if (isOnline == 0) {
   request.getSession().invalidate();
  }
  // 1代表上线
  if (isOnline == 1) {
   PrintWriter out = response.getWriter();
   Counter counter = Counter.getInstance();
   int online = counter.getOnlineCounter();
   out.println("There are " + online + " users online...");
   out.flush();
   out.close();
  }
 }
}