评论

收藏

[JSP] jsp网页计数器实现示例

开发技术 开发技术 发布于:2021-10-23 18:14 | 阅读数:393 | 评论:0

//过滤器类 
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="https://img.blog.csdn.net/20130728233435953?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2tyZ3diag==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center"><img alt="" src="https://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,从而实现当关闭服务的时候,把文件保存在磁盘中。下次从磁盘中读取。
关注下面的标签,发现更多相似文章