有些时候,我们可能会对整个网站的点击量感兴趣,想要知道这个网站的总点击量。在Servlet中,这是非常简单的,我们可以使用过滤器做到这一点。
下面是实现一个简单的基于过滤器生命周期的网站点击计数器需要采取的步骤:
- 在过滤器的 init() 方法中初始化一个全局变量。
- 每次调用 doFilter 方法时,都增加全局变量。
- 如果需要,你可以在过滤器的 destroy() 中使用一个数据库表来存储全局变量的值。在下次初始化过滤器时,该值可在 init() 方法内被读取, 这一步是可选的。
在这里,假设Web容器将无法重新启动。如果重新启动或 Servlet 被销毁,点击计数器将被重置。
下面示例演示了如何实现一个简单的网站点击计数器,代码如下:
package com.test.servlet;
import java.io.IOException;
//必须导入的包
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class WebCounter implements Filter {
private int hitCount;
public void destroy() {
// 这一步是可选的,但是如果需要,可以把 hitCount 的值写入到数据库
}
public void init() throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 把计数器的值增加 1
hitCount++;
// 输出计数器
System.out.println("网站访问统计:" + hitCount);
// 把请求传回到过滤器链
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig config) throws ServletException {
// 重置点击计数器
hitCount = 0;
}
}
下面来编译上面的 Servlet,并在web.xml文件中创建以下条目:
<filter>
<filter-name>WebCounter</filter-name>
<filter-class>WebCounter</filter-class>
</filter>
<filter-mapping>
<filter-name>WebCounter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
现在访问网站的任意页面,比如 http://localhost:8080/。这将会在每次任意页面被点击时,把计数器的值增加 1,它会在日志中显示以下消息: