欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

jsp网页计数器实现示例

程序员文章站 2023-11-17 23:11:58
复制代码 代码如下: //过滤器类 public class econdingfilter implements filter { private string chars...
复制代码 代码如下:

//过滤器类
public class econdingfilter implements filter {
private string charset = null;
private servletcontext context = null;
private string path = "";
/**
* 在销毁前将数据存入本地文件中
*/
public void destroy() {
//获取servlecontext中的属性的那个值
string nums = (string) context.getattribute("nums");
//创建写入流
filewriter fw = null;
bufferedwriter bw = null;
try {
fw = new filewriter(path);
bw = new bufferedwriter(fw);
bw.write(nums);
} catch (exception e) {
e.printstacktrace();
} finally {

try {
if (bw != null) {
bw.close();
}
if (fw != null) {
fw.close();
}
} catch (ioexception e) {
// todo auto-generated catch block
e.printstacktrace();
}

}
system.out.println("filter销毁");
}

复制代码 代码如下:

public void dofilter(servletrequest request, servletresponse response,
filterchain chain) throws ioexception, servletexception {
// todo auto-generated method stub
system.out.println("dofilter前");
string path = ((httpservletrequest)request).getservletpath();//获取每次访问的action的相对路径
<img alt="" src="http://img.blog.csdn.net/20130728233435953?watermark/2/text/ahr0cdovl2jsb2cuy3nkbi5uzxqva2tyz3diag==/font/5a6l5l2t/fontsize/400/fill/i0jbqkfcma==/dissolve/70/gravity/center"><img alt="" src="http://img.blog.csdn.net/20130728233445625?watermark/2/text/ahr0cdovl2jsb2cuy3nkbi5uzxqva2tyz3diag==/font/5a6l5l2t/fontsize/400/fill/i0jbqkfcma==/dissolve/70/gravity/center"> //判断路径,如果是登陆的那个action,就让保存的context里面的那个属性加1
if(path.endswith("/login.action")){
context.setattribute("nums",integer.parseint(context.getattribute("nums").tostring())+1+"");
}
request.setcharacterencoding(charset);
response.setcharacterencoding(charset);
chain.dofilter(request, response);
system.out.println("dofilter后");

}

复制代码 代码如下:

public void init(filterconfig filterconfig) throws servletexception {
// todo auto-generated method stub
system.out.println("filter初始化");
//获取编码格式
charset = filterconfig.getinitparameter("encoding");
//获取servletcontext
context = filterconfig.getservletcontext();
system.out.println(charset);

path = context.getrealpath("");
file file = new file("d:\\text.txt");
if (!file.exists()) {//判断文件是否存在
// 如果文件不存在,就创建一个文件,保存在d盘中
file = new file("d:\\text.txt");
filewriter fw = null;
bufferedwriter bw = null;
try {
fw = new filewriter(file);
bw = new bufferedwriter(fw);
bw.write(0 + "");// 写入初始化数据0
} catch (exception e) {
e.printstacktrace();
} finally {
try {
if (bw != null) {
bw.close();
}
if (fw != null) {
fw.close();
}
} catch (ioexception e) {
// todo auto-generated catch block
e.printstacktrace();

}
}
}
//当每次tomcat启动服务时,进行读取创建的那个文件
path = "d:\\text.txt";
// 从本地读取访问的人数的文件
filereader fr = null;
bufferedreader bf = null;
string nums = "";
try {
fr = new filereader(path);
bf = new bufferedreader(fr);
nums = bf.readline();
system.out.println(nums);
} catch (exception e) {
e.printstacktrace();
} finally {

try {
if (bf != null) {
bf.close();
}
if (fr != null) {
fr.close();
}
} catch (ioexception e) {
// todo auto-generated catch block
e.printstacktrace();
}
}
//将获得到的数据保存在servletcontext中
context.setattribute("nums", nums);
}

}

用过滤器方便的一点,不需要我们每次手动去调用,当web服务启动时候,自动会引用。首先说下,我写到init方法的依据是,每次web服务启动会调用一次init方法,当关闭服务的时候会调用一次destory方法,将计数的那个数据文件,这个方法写到init方法和destory方法,这样可以减少每次的不断的读取服务器和读取写入文件的次数,当我们每登陆一次,就让servletcontext中的那个attr加1,从而实现当关闭服务的时候,把文件保存在磁盘中。下次从磁盘中读取。