1 设计一个监听类 com.yilong.listener.ApplicationListener
2设计一个过滤器com.yilong.filter.MyFilter拦截所有的用户请求
3在web.xml中注册过滤器和监听器
package com.yilong.listener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ApplicationListener implements ServletContextListener{
public void contextDestroyed(ServletContextEvent sce) {
ServletContext context=sce.getServletContext();
PrintWriter pw=null;
try {
pw = new PrintWriter(context.getRealPath("/WEB-INF/count.txt"));
pw.write(String.valueOf(context.getAttribute("count")));
pw.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally{
if(pw!=null){
pw.close();
}
}
}
public void contextInitialized(ServletContextEvent sce) {
ServletContext context=sce.getServletContext();
File file=new File(context.getRealPath("/WEB-INF/count.txt"));
System.out.println(context.getRealPath("/WEB-INF/count.txt"));
FileReader fr=null;
BufferedReader br=null;
try {
fr=new FileReader(file);
br=new BufferedReader(fr);
String countStr=br.readLine();
if(countStr==null){
countStr="0";
}
Integer count=Integer.parseInt(countStr);
System.out.println(count);
context.setAttribute("count", count);
} catch (Exception e) {
try {if(fr!=null){
fr.close();
} if(br!=null){
br.close();
}}
catch (Exception e1) {
e1.printStackTrace();
}
}
}
}
package com.yilong.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;
public class MyFilter implements Filter{
private ServletContext context;
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
synchronized (this) {//同步块,这里解决并发问题,但影响访问速度,
Integer count=(Integer) context.getAttribute("count");
count=count+1;
System.out.println(count);
context.setAttribute("count", count);
chain.doFilter(request, response);
}
}
public void init(FilterConfig config) throws ServletException {
context=config.getServletContext();
}
}
3 web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<filter>
<filter-name>myfilter</filter-name>
<filter-class>com.yilong.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myfilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>com.yilong.listener.ApplicationListener</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
4.index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>统计</title>
</head>
<body>
${applicationScope.count }
</body>
</html>