在网站开发中,有很多功能需要使用ServletContext,比如:

1.网站计数器

2.网站在线用户的显示

3.简单的聊天系统

总之,如果是涉及到不用用户共享数据,而这些数据量不大,同时又不希望写入数据库中,我们就可以考虑使用ServletContext来实现有效点击:

1.只要访问过该网页就算一次,刷新也算一次,有点假

2.不同的ip访问,算一次;如果同一个ip在一定时间(如一天),不管浏览该网页多少次都算一次

3.用户推出网站,再次访问页算一次

实现方案:

1.当某个用户访问该网页时,就在该数据库中增加一次(比如有一张统计表)

缺点:对数据库访问太频繁,服务器压力太大

优点:很好理解,也好实现

2.设置一个静态变量,当服务器启动时,可以通过文件或表初始化该变量;当服务器关闭时,再将变量的值写入到文件或是数据库中

缺点:实现复杂,要求对文件操作

优点:效率高,不会频繁的访问文件或数据库

3.使用ServletContext,它的实现与第二种相似

实现网站计数器

1.在Wel.java中操作ServletContext,每刷新一次算一次

2.在LoginCl.java中操作ServletContext,用户每成功登陆一次算一次

3.对2方法的优化改进(减少对文件的操作)各个用户每登陆一次,就要去操作一个文件,这样效率低下,可不可以减少对文件的操作次数:

在Servlet的生命周期中——

可以在init()方法中初始化servletContext中属性times对应的初始值

可以在destroy()方法中,一次性的将serveletcontext中属性times

对应的值写入文件中

代码实现:

在LoginCl.java中:

1.重写init()方法

public void init() throws ServletException
{
try{
/* 只会被调用一次 */
System.out.println( "init被调用" ); /*
* ========添加网页访问次数的功能(读取部分)===========
* 用户成功登陆一次就计算一次
*/
FileReader fr = new FileReader( "D://myCounter.txt" );
BufferedReader br = new BufferedReader( fr );
String numVal = br.readLine();
br.close(); /* 将times值放入到servletContext中 */
this.getServletContext().setAttribute( "visitTimes", numVal );
/* ========添加网页访问次数的功能(读取部分)=========== */
}catch ( Exception ex ) {
ex.printStackTrace();
}
}

2.在process()方法中添加计数功能

/*
* ========添加网页访问次数功能(计算部分)=========
* 将ServletContext中的visitTime所对应的值++
*/
String times = this.getServletContext().getAttribute( "visitTimes" ).toString();
/* 对times的值++再重新写回servletContext */
this.getServletContext().setAttribute( "visitTimes", (Integer.parseInt( times ) + 1) );
/* ========添加网页访问次数功能(计算部分)========= */

3.重写destroy()方法

public void destroy()
{
try{
System.out.println( "destroy被调用" );
/*
* ========添加网页访问次数的功能(写入部分)===========
* 再将新的次数写回文件
*/
FileWriter fw = new FileWriter( "D://myCounter.txt" );
BufferedWriter bw = new BufferedWriter( fw );
bw.write( this.getServletContext().getAttribute( "visitTimes" ).toString() );
bw.close(); /* 关闭文件流 */
/* ========添加网页访问次数的功能(写入部分)=========== */
}catch ( Exception ex ) {
ex.printStackTrace();
}
}

4.在页面显示(Wel.java)

/* 显示网页访问次数 */
pw.println( "该网页被访问了" + this.getServletContext().getAttribute( "visitTimes" ).toString() + "次<br>" );
/* 显示主机IP地址 */
pw.println( "您的IP地址=" + req.getRemoteAddr() + "<br>" );
/* 显示主机名 */
pw.println( "你的主机名=" + req.getRemoteHost() + "<br>" );
pw.println( "</center></body>" );

ServletContext实现网站计数器的更多相关文章

  1. ServletContext与网站计数器

    什么是ServletContext? ServletContext是服务器的一个公用的空间,是不同的浏览器共享的一个数据. 由图可以看出ServletContext和Cookie与session之间的 ...

  2. ServletContext结合Servlet接口中的init()方法和destroy()方法的运用----网站计数器

    我们一般知道Servlet接口中的init()方法在tomcat启动时调用,destroy()方法在tomcat关闭时调用.那么这两个方法到底在实际开发中有什么作用呢?这就是这个随笔主要讲的内容. 思 ...

  3. application 网站计数器

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  4. Histats安装Counter网站计数器 - Blog透视镜

    Histats提供十分多样性的Counter网站计数器,可以依照你个人的喜好与需求,选择适合的Counter网站计数器,也可以针对同一网站,安装多个Counter网站计数器,作法其实比注册账号时更简单 ...

  5. Histats申请Counter网站计数器 - Blog透视镜

    为了计算网页被浏览的次数,访客人数等统计数据,作为未来分析之用,可以向Histats申请免费的Counter网站计数器,它的功能相当齐全,同时也会保留一段时间的资料,当作统计比较的资料,更可以进一步付 ...

  6. servlet-servletContext网站计数器

    1.在项目中新建文件夹新建文件nums.txt 2.在web.xml文件配置 <servlet>     <description>This is the descriptio ...

  7. zabbix添加IIS网站计数器(并发连接数)详解

    环境:windows server 2012 前提:IIS上要添加好配置   1,在被监控主机,powershell输入perfmon.msc   2,点击添加按钮     3,在下拉菜单中点击小箭头 ...

  8. Servlet之ServletContext以及文件操作

    ServletContext ------------------------------------ ServletContext是什么? 与cookie,session比较. 可以把它想象成一个共 ...

  9. 【jsp网站计数功能】 application session

    在jsp页面中实现网站计数器的方法有很多,其中比较普遍的做法是利用application 和session对象.application对象可被所有用户共享:session是单用户共享,用户从访问系统开 ...

随机推荐

  1. InvalidOperationException: Cannot create a DbSet for 'IdentityUserClaim<string>' because this type is not included in the model for the context.

    An unhandled exception occurred while processing the request. InvalidOperationException: Cannot crea ...

  2. 2.python的基本数据类型

    (1)整形和浮点型 (2)布尔 (3)字符串 (4)转义 (5)字符串的操作 (6)列表 (7)元组 (8)集合set 特性:无序.不重复 (9)字典

  3. Angular 学习1

    AngularJS 表达式 AngularJS 使用 表达式 把数据绑定到 HTML. AngularJS 表达式 AngularJS 表达式 很像 JavaScript 表达式:它们可以包含文字.运 ...

  4. 【转载】webdriver 自动化测试如何定位到动态变化ID的iframe框内

    大家知道,在自动化测试脚本编写过程中,如果页面上跳出一个iframe框时,我们是定位不到框内内容的,可以通过 driver.findElement(By.id("")); driv ...

  5. HDU 5477: A Sweet Journey

    A Sweet Journey Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  6. c++ opencv 数学函数示例

    // ConsoleApplication11.cpp : Defines the entry point for the console application. // #include " ...

  7. List列表删除值为指定字段

    需要处理一个场景,当值为某一个固定值或者为空的时候,删除列表中的这个值. ;i<list.size();i++){ if(list.get(i).equals("del")) ...

  8. 当chart图遇上bootstrap的TAB切换 无宽高问题?

    .tab-content > .tab-pane, .pill-content > .pill-pane {    display: block; /* undo display:none ...

  9. BZOJ:3231: [Sdoi2008]递归数列

    题解: 矩阵乘法,在矩阵中构造当前前缀和: 注意:for(int/long long ;;); #include<iostream> #include<cstdio> #inc ...

  10. 一小时搞定Eureka

    一.什么是Eureka Eureka是Netflix公司开源的产品,它是一种基于REST( Representational State Transfer )的服务,主要用于AWS云. Eureka提 ...