在Servlet中应用ServletContext接口,Servlet容器在启动一个Web应用时,会为它创建一个ServletContext对象。当Servlet容器终止一个Web应用时,ServletContext对象也会被销毁,所以该对象与Web应用程序有同样的生命周期
在ServletContext接口中存取共享数据的方法有:
-
setAttribute(String name,Object
object):在ServletContext对象中存放共享数据,参数name表示属性名,参数object表示属性值; -
removeAttribute(String name):根据指定参数name属性名,删除ServletContext对象中的共享数据;
-
getAttribute(String name):根据指定的参数name属性,获取ServletContext对象中的共享数据;
新建CounterServlet的Servlet类,在doPost()方法中实现统计用户的访问次数public class CounterServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获得ServletContext对象 ServletContext context = getServletContext(); //从ServletContext中获得计数器对象 Integer count = (Integer)context.getAttribute("counter"); if(count==null){//如果为空,则在ServletContext中设置一个计数器的属性 count=1; context.setAttribute("counter", count); }else{ //如果不为空,则设置该计数器的属性值加1 context.setAttribute("counter", count+1); } response.setContentType("text/html"); //响应正文的MIME类型 response.setCharacterEncoding("UTF-8"); //响应的编码格式 PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>统计网站访问次数</TITLE></HEAD>"); out.println(" <BODY>"); out.print(" <h2><font color='gray'> "); out.print("您是第 "+context.getAttribute("counter")+" 位访客!"); out.println("</font></h2>"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); } }
新建CounterListener类
public class CounterListener implements ServletContextListener {
/**
* Web服务器终止时,调用该方法
* 向保存计数器文件中写一个当前网站的访问次数
*/
@Override
public void contextDestroyed(ServletContextEvent contextEvent) {
ServletContext context = contextEvent.getServletContext();
Integer count = (Integer)context.getAttribute("counter");
if(count!=null){
try{
String path =context.getRealPath("/count.txt");
File file = new File(path);
FileWriter fw = new FileWriter(file);
BufferedWriter bw = new BufferedWriter(fw);
bw.write(context.getAttribute("counter").toString());
bw.flush();
bw.close();
fw.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
/**
* 当Web服务器启动时,调用该方法
* 读取计数器文件中保存的网站访问次数
*/
@Override
public void contextInitialized(ServletContextEvent contextEvent) {
Integer count = 0;
ServletContext context = contextEvent.getServletContext();
try{
String path =context.getRealPath("");
File file = new File(path,"count.txt");
System.out.println(file.getPath());
if(!file.exists()){
file.createNewFile();
FileWriter fw = new FileWriter(file);
BufferedWriter bw = new BufferedWriter(fw);
bw.write("0");
bw.flush();
bw.close();
fw.close();
}else{
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
count = new Integer(br.readLine());
context.setAttribute("counter", count);
br.close();
fr.close();
}
}catch(Exception ex){
ex.printStackTrace();
}
}
}
web.xml文件配置
<servlet>
<servlet-name>CounterServlet</servlet-name>
<servlet-class>com.cn.zj.Servlet.CounterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CounterServlet</servlet-name>
<url-pattern>/counter</url-pattern>
</servlet-mapping>
<listener>
<listener-class>com.cn.zj.Servlet.CounterListener</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>