因为Servlet本来就是一个.java文件,因此,servlet中操作文件和普通java文件操作一样。
内存数据<-磁盘文件(读入,输入)
内存数据->磁盘文件(写入,输出)
ServletFileTest1.java读文件
ServletFileTest2.java写文件
package com.tsinghua;
import java.io.*;
import javax.servlet.http.*;
public class ServletFileTest1 extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res){
try{
res.setContentType("text/html;charset=gbk");
PrintWriter pw=res.getWriter();
FileReader f=new FileReader("D:/java/myCounter.txt");
BufferedReader bw=new BufferedReader(f);
String numval=bw.readLine();
bw.close();
pw.println("从文件中读取的数据是:"+numval);
}catch(Exception ex){
ex.printStackTrace();
}
}
public void doPost(HttpServletRequest req,HttpServletResponse res){
this.doGet(req,res);
}
}
package com.tsinghua;
import java.io.*;
import javax.servlet.http.*;
public class ServletFileTest2 extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res){
try{
res.setContentType("text/html;charset=gbk");
PrintWriter pw=res.getWriter();
FileWriter f=new FileWriter("D:/java/myCounter.txt");
BufferedWriter bw=new BufferedWriter(f);
bw.write("123");
bw.close();
pw.println("在文件中写入了数据");
}catch(Exception ex){
ex.printStackTrace();
}
}
public void doPost(HttpServletRequest req,HttpServletResponse res){
this.doGet(req,res);
}
}
总之,如果涉及到不同用户共享数据,而这些数据量又不大,同时又不希望写入数据库中,我们可以考虑使用ServletContext来实现。
网站计数器的实现。
普通的计数器的实现(后面谈缺点):
//添加网页访问次数的功能
FileReader fw=new FileReader("D:\\java\\myCounter.txt");
BufferedReader br=new BufferedReader(fw);
String numval=br.readLine();
br.close();
int times=Integer.parseInt(numval);
//增加一次
times++;
res.sendRedirect("wel?uname="+u+"&upasswd="+p);
//再将新的次数写回去
FileWriter f=new FileWriter("D:\\java\\myCounter.txt");
BufferedWriter bw=new BufferedWriter(f);
bw.write(times+"");
bw.close();
缺点:各个用户每登录成功登录一次,就要操作一个文件,这样效率低下,咋们可不可以减少对文件的操作次数?我们可以在init()方法中初始化servletcontext中属性times对应的初始值。然后在destroy()方法中,一次性的将servletcontext中属性times对应的值,写入文件中。
当然必须重写init函数,destroy函数
public void init(){
try{
FileReader fw=new FileReader("D:\\java\\myCounter.txt");
BufferedReader br=new BufferedReader(fw);
String numval=br.readLine();
br.close();
int times=Integer.parseInt(numval);
//将times值放入到servletcontext
this.getServletContext().setAttribute("visitTimes",times+"");
System.out.println("init被调用");
}catch(Exception ex){
ex.printStackTrace();
}
}
public void destroy(){
try{
//再将新的次数写回去
FileWriter f=new FileWriter("D:\\java\\myCounter.txt");
BufferedWriter bw=new BufferedWriter(f);
bw.write(this.getServletContext().getAttribute("visitTimes").toString());
bw.close();
System.out.println("destroy被调用");
}catch(Exception ex){
ex.printStackTrace();
}
}
doGet方法内实现增加计数功能。
//将servletContext中的visitTime所对应的值+1
String times=this.getServletContext().getAttribute("visitTimes").toString();
//对times++再重新放回servlet
this.getServletContext().setAttribute("visitTimes",(Integer.parseInt(times)+1)+"");