首先创建名称为CountFilter的类,将其放置在com.chesg.filter包中,该类实现javax.servlet.Filter接口,是一个过滤器对象,通过该过滤器实现统计网站访问人数功能,下图是eclipse编辑器文件结构图
关键代码如下,CountFilter.java文件
package com.chesg.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
/**
* Servlet Filter implementation class CountFilter
*/
@WebFilter("/CountFilter")
public class CountFilter implements Filter {
private int count;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
String param=filterConfig.getInitParameter("count");
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
// pass the request along the filter chain
count++;
HttpServletRequest req=(HttpServletRequest) request;
ServletContext context=req.getSession().getServletContext();
context.setAttribute("count", count);
chain.doFilter(request, response);
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
}
在CountFilter类中,包含了一个成员变量count,用于记录网站访问的人数,该变量在过滤器的初始化方法init()中被赋值,它的初始化值通过FilterConfig对象读取配置文件中的初始化参数进行获取。计数器count变量的值在CountFilter类中的doFilter()方法中被递增,因为客户端在请求服务器中的web应用时,过滤器拦截请求通过doFilter()方法进行过滤处理,所以,当客户端请求web应用时,计数器count的值将自增1。为了能够访问计数器中的值,实例中将其放置于Servlet上下文中,Servlet上下文对象通过将ServletRequest转换为HttpServletRequest对象后获取。
配置已创建的CountFilter对象,此操作通过配置web.xml文件进行实现。关键代码如下:
<!-- 过滤器声明 -->
<filter>
<filter-name>CountFilter</filter-name>
<filter-class>com.chesg.filter.CountFilter</filter-class>
<init-param>
<param-name>count</param-name>
<param-value>0</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CountFilter</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
CountFilter对象配置主要是通过声明过滤器及创建过滤器的映射进行实现,其中声明过滤器通过<filter>标签进行实现。在声明过程中,实例通过<init-param>标签配置过滤器的初始化参数,初始化参数为count,参数值为0。创建首页index.jsp页面,在该页面中通过JSP内置对象Application获取计数器的值。关键代码如下:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>第一个Java Web应用</title>
</head>
<body >
<h2>
欢迎光临,<br>
您是本站的第【
<%=application.getAttribute("count") %>
】为访客!
</h2>
</body>
</html>
最后启动tomcat服务器,实例运行后,将进入到程序的主页面index.jsp页面,没刷新一次数值加1,最后效果如图所示: