创建一个过滤器,实现网站访问计数器的功能,并在web.xml文件的配置中将网站访问量的初始值设置为5000。
创建名称为CountFilter的类
创建名称为CountFilter的类,该类实现javax.servlet.Filter接口,是一个过滤器对象,通过该过滤器实现统计网站访问人数。代码如下:
package org.life.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.http.HttpServletRequest;
public class CountFilter implements Filter {
//来访数量
private int count;
public void init(FilterConfig fConfig) throws ServletException {
//获取初始化参数
String param = fConfig.getInitParameter("count");
//将字符串转换为int
count = Integer.valueOf(param);
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//访问数量自增
count++;
//将ServletRequest转换为HttpServletRequest
HttpServletRequest req = (HttpServletRequest) request;
//获取ServletContext
ServletContext context = req.getSession().getServletContext();
//将来访数量值放入到ServletContext中
context.setAttribute("count", count);
//向下传递过滤器
chain.doFilter(request, response);
}
public void destroy() {
}
}
在CountFilter类中包含了一个成员变量count,用于记录网站访问人数,该变量在过滤器访问的初始化方法init()中被赋值,它的初始化值通过FilterConfig对象读取配置文件中的初始化参数进行获取。
计数器count变量的值在CountFilter类的doFilter()方法中被递增,因为客户端在请求服务器中的Web应用时,过滤器拦截请求通过doFilter()方法进行过滤处理。为了能够访问计数器中的值,实例中将其放置于Servlet上下文中,Servlet上下文对象通过将ServletRequest转换为HttpServletRequest对象后获取。
Tips:过滤器对象中的3个方法中,除了doFilter()方法外,如果在业务逻辑中不涉及初始化方法init()与销毁方法destroy(),可以不编写任何代码对其进行空实现。
配置已创建的CountFilter对象
配置已创建的CountFilter对象,此操作通过配置web.xml文件进行实现。关键代码如下
<!-- 过滤器声明 -->
<filter>
<display-name>CountFilter</display-name>
<filter-name>CountFilter</filter-name>
<filter-class>org.life.filter.CountFilter</filter-class>
<!-- 设置初始化参数 -->
<init-param>
<!-- 参数名 -->
<param-name>count</param-name>
<!-- 参数值 -->
<param-value>5000</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CountFilter</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
在声明过程中,实例通过<init-param>标签配置过滤器的初始化参数,初始化参数的名称为count,参数值为5000。
Tips:如果直接对过滤器对象中的成员变量进行赋值,那么在过滤器被编译后将不可修改,所以,实例中将过滤器对象中的成员变量定义为过滤器的初始化参数,从而提高代码的灵活性
创建程序中的首页index.jsp
创建程序中的首页index.jsp,在该页面中通过JSP内置对象Application获取计数器的值。关键代码如下
<body>
<h2>欢迎光临,<br/>
你是本站的第【<%=application.getAttribute("count") %>】位访客!
</h2>
</body>
这里有一个问题,就是初始值设置的是5000,第一次访问应该是第5001位访客,但为什么是5002位访客。
这里我自己也debug了一下,发现运行过程中,程序先自己走一遍流程,但是第一遍的时候不输出访客数,第二遍的时候才输出,感觉可能是服务器第一次启动的问题,不过自己对于这方面不是很了解,百度也没百度到结果,所以希望看到的能评论一下这个问题是怎么回事,谢谢。