Servlet 页面点击计数器
实现Servlet上某个页面的总点击量,使用 Servlet 来计算这些点击量是非常简单的,因为一个 Servlet 的生命周期是由它运行所在的容器控制的。
以下是实现一个简单的基于 Servlet 生命周期的网页点击计数器需要采取的步骤:
- 在 init() 方法中初始化一个全局变量;
- 每次调用 doGet() 或 doPost() 方法时,都增加全局变量;
- 如果需要,可以在destroy() 中可以使用一个数据库表来存储全局变量的值。在下次初始化 Servlet 时,该值可在 init() 方法内被读取,这样处理可以实现该数据的持久化;
- 如果只想对一个 session 会话计数一次页面点击,那么请使用 isNew() 方法来检查该 session 会话是否已点击过相同页面;
在这里,假设 Web 容器将无法重新启动。如果是重新启动或 Servlet 被销毁,计数器将被重置。
public class PageHitCounter extends HttpServlet {
private int hitCount;
public void init(){
hitCount = 0; // 重置点击计数器,如果要实现hitCount的持久化,可以在这里从数据库中读取该数据
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
// 增加 hitCount
hitCount++;
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String docType = "<!DOCTYPE html> \n";
out.println(docType +
"<html>\n" +
"<head><title>Hit Count</title></head>\n" +
"<body">\n" +
"<h1 align=\"center\">Hit Count</h1>\n" +
"<h2 align=\"center\">" + hitCount + "</h2>\n" +
"</body></html>");
}
public void destroy() {
// 但是如果需要实现hitCount的持久化,可以把 hitCount 的值写入到数据库
}
}
以下是实现一些页面计数器的思路;
网站所有页面的总访问量
使用 Filter 过滤器实现,设置某个过滤器,映射到所有页面(HTML,Servlet,JSP),在该 Filter 的doFilter()过程中 对储存在数据库中的计数值进行增加(也可以将该计数值储存在 web.xml 中<filter><init-param>中);
某个页面的总访问量
如果该页面是Servlet,可以在其 init() 时对计数值进行初始化(从数据库读取),在service()对该计数值进行自增,在destroy()将该计数值写入数据库(如果考虑到数据同步问题,在destory时不直接将计数值写入数据库,而是直接在数据库中对该数据进行自增,以保持数据同步);
如果该页面是 JSP 或 HTML,可以直接使用Filter映射到指定页面实现(也适用与Servlet);
网站的总在线量
通过 Http
SessionListener实现;
OlineCount.java :记录在线信息
(也可以实现为一个记录所有在线人数信息的列表,此时要在OnlineListener实现
HttpSessionAttributeListener后在其
attributeAdded ,
attributeRemoved方法进行相应的实现,同时要在负责登录登出的Sevlet进行session添加,删除相应属性 );
//应该实现 count 数据的同步性,这里略过
public class OnlineCount{
private static int count = 0;
public static void add(){
count ++;
}
public static void reduce(){
count --;
}
public static int value(){
return count;
}
}
public class OnlineListener implements HttpSessionListener{
//根据session的建立和销毁进行计数
public void sessionCreated(HttpSessionEvent se) {
OnlineCount.add();
}
public void sessionDestroyed(HttpSessionEvent se) {
onlineCount.reduce();
}
}
web.xml 中添加 listener的配置
<listener>
<listener-class>listener.OnlineListener</listener-class>
</listener>
在 Servlet 或 JSP 中要获取在线总人数 直接调用 OnlineCount.value();