--显示页面 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 οnbefοreunlοad="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();
}
}
}