最近在学做网站计数器。想在用户登录的时候才计算,但是一直返回servletcontext是空值,下面是我的一部分代码public void init()  {

try {
//创建一个FILEREADER
FileReader f=new FileReader("f:\\myCounter.txt");
BufferedReader br=new BufferedReader(f);
//读取一个数据
String numVal=br.readLine();
//将TIMES 值放入servlet中
this.getServletContext().setAttribute("visittimes",numVal);
br.close();

System.out.println("init!!!");
System.out.println(this.getServletContext().getAttribute("visittimes"));//这里老是返回空值
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} public void destroy() {

try {
//将新的次数写回去
FileWriter fw=new FileWriter("f:\\myCounter.txt");
BufferedWriter bw=new BufferedWriter(fw);
//在文件中写入数据
bw.write(this.getServletContext().getAttribute("visittimes").toString());
bw.close();
System.out.println("destroy!!");//这里没有被调用
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
还有当我tomcat reload的时候发现destroy好像没被调用,请问是什么原因?

解决方案 »

  1.   

    一个请求结束,destroy才会被调用啊!
      

  2.   

    楼主看看numVal是否为空值
      

  3.   

    this.getServletContext().setAttribute("visittimes",numVal);
    在这里设断点,看numVal是多少?如果这里为空,检查你的输入文件路径还有不要写死路径成你本机的一个目录,Web的应用都用相对路径
      

  4.   

     String numVal=br.readLine();你这句话是准备读取文件,还是读取输入啊!看你的代码是要读取文件而不是输入。。
      

  5.   

    断点跟踪吧, 首先看下你的myCounter.txt文件是否正常。
      

  6.   

    谢谢回复,我暂时不会用MYECLIPSE的DEBUG,不过我用system.out.print();测试了,numVal为空,请问我的文件路径有没有写错格式?这个文件就是一个直接放在F盘的文档而已,还有,请问你最后一句话是什么意思?请解析,谢谢
      

  7.   

    没错,是读取东西,我的思路是:先读取文档中的数据,然后写入servletContex,然后再在退出的情况下调用destroy,在destroy里面,同时把servletcontex的东西保存到那文档里面,那下次登录的时候就能调用init中的读取步骤了,不知道你明白不明白我的意思,呵呵
      

  8.   

    补充一下,numVal为空,但是我已经忘里面事先填写了一些数字,但是还是读取不出来啊~
      

  9.   

    有一种方法是:将源代码中的init()方法稍加修改源代码部分:
    String numVal=br.readLine();修改后:
    int numVal=br.readLine();可以试一试!