首先我需要一个能访问网站人数的功能,那莫具体来讲就是需要一个能全局存储的,在 java web 中 为啥不用session 因为他代表的试一次会话是一种局部存储, 所以用 servletContext 存储更加合适因为他是全局的, 可以实现ServletContextListener 接口重写里面的2个方法
如果你没懂我说的他们之前区别可以看看
contextDestroyed(ServletContextEvent arg0)
contextInitialized(ServletContextEvent arg0)
在初始化中可以读取我存储在磁盘文件那个文件获取个数 因为如果不存储的话 服务器停止他也会没有了
在销毁的方法中我可以拿到存储在servletcontext中的个数并存储在文件中,这样就可以实现存储保存了
当然这边的方法是多种的你愿意存储在哪就存在哪,数据库 其他都可以
废话了那莫多开始 coding 吧
首先自定义一个我自己的监听器,然后重写2个方法,销毁的方法中是存储在磁盘的路径你可以任意指定,但是你存储在WEN-INF/classes 中他会报没有访问权限的错误
package com.listener;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyListener implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
System.out.println("推出");
ServletContext sc = arg0.getServletContext();
Counter counter = (Counter) sc.getAttribute("counter");
if(counter!=null) {
//String filepath = s
try {
//BufferedWriter bw = new BufferedWriter(new OutputStreamWriter())
//PrintWriter pw = new PrintWriter("/count.txt");
PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("D:\\develop\\apache-tomcat-7.0.67\\webapps\\test\\WEB-INF\\classes\\count.txt")));
pw.println(counter.getCounter());
pw.flush();
pw.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
System.out.println("进入");
ServletContext sc = arg0.getServletContext();
System.out.println(sc.getResourceAsStream("/WEB-INF/classes/count.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(sc.getResourceAsStream("/WEB-INF/classes/count.txt")));
try {
int count = Integer.parseInt((br.readLine()));
br.close();
sc.setAttribute("counter", new Counter(count));
} catch (NumberFormatException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
然后就是页面了
pageEncoding="UTF-8" import="com.listener.*"%>
Insert title hereCounter count = (Counter) this.getServletContext().getAttribute("counter");
count.setCounter(count.getCounter() + 1);
this.getServletContext().setAttribute("counter", count);
%>
实体类
package com.listener;
public class Counter {
private int counter;
public void setCounter(int counter) {
this.counter = counter;
}
public int getCounter() {
return counter;
}
public Counter(int counter) {
// TODO Auto-generated constructor stub
this.counter = counter;
}
}
最后不要忘了在web.xml 中配置listener 中让我们自定义的起作用
com.listener.MyListener
Archetype Created Web Application
本人不才,希望大神提出指导意见