zoukankan      html  css  js  c++  java
  • ServletContext与网站计数器

    什么是ServletContext?

    ServletContext是服务器的一个公用的空间,是不同的浏览器共享的一个数据。

    由图可以看出ServletContext和Cookie与session之间的区别。

    ServletContext有哪些用处呢?
    1.网站计数器
    2.网站在线用户的显示
    3.简单的聊天工具
    总之,如果是设计到不同用户共享带护具,而中和喜爱数据量不大,
    同时又不希望写入数据库中,我们就可以考虑使用ServletContext来实现。
    注意事项:
    因为存在ServletContext中的数据会长时间保存在服务器,会占用内存,因此我们建议不要向ServletContext中添加过大的数据。。。切记

    如何使用ServletContxt?

    1.如何得到ServletContext实例
    this.getServletContext();

    2.你可以将它想象成一个表,这个和Session非常相似:

    每一行就是一个属性。
    添加属性:setAttribute(String name ,Object ob);
    得到值  :getAttribute(String name)返回Object
    删除属性:removeAttribute(String name)
    3.生命周期

    ServletContext中的属性的生命周期从创建开始到服务器关闭而结束。

    怎么实现一个网站计数器?

    怎么算一次有效的点击,各个网站有不同的标准:
    1.只要访问过该网页就算是一次,刷新一次也算你。
    2.不同的ip访问该网页,算一次点击。如果是同一个ip在一定时间内,不管浏览器访问多少次都算。
    3.用户访问网站,再次访问也算一次。

    实现方案:
    1.当有某个用户访问该网页时,就在数据库中增加一次。
    缺点:对数据库访问太频繁,服务器压力太大。
    优点:很好理解,也好实现
    2.设置一个静态变量,当服务器启动时,可以通过文件或表初始化该变量,当服务器关闭时,再将
    变量的值写入到文件中或是数据库中。
    缺点:实现复杂,要求对文件操作
    优点:效率高,不会频繁的访问文件或数据库
    3.使用ServletContext,它的实现和第二种很相似。

    //添加网页访问次数的功能
    //创建一个FileReader
    FileReader f=new FileReader("e://myDocument.txt");
    BufferedReader br=new BufferedReader(f);
    //读出一行数据
    String numVal=br.readLine();
    //一定要关闭文件流
    br.close();
    int times=Integer.parseInt(numVal);
    //增加一次
    times++;
    //再将新的次数写回去
    FileWriter w=new FileWriter("e://myDocument.txt");
    BufferedWriter bw=new BufferedWriter(w);
    bw.write(times+"");
    bw.close();

    问题:每个用户每登录一次,就要操作一个文件,这有很安全但是效率低,咱们可不可以减少对文件的操作次数

    可以在init()方法中初始化,servletContext中属性times对应的初始值。
    可以在destroy()方法中,一次性的将servletContext中属性的times对应的值,
    写入到文件中,这样就可以减少对文件的操作次数。

    <//重写init函数,init只会在启动tomcat调用servlet时被执行
        public void init(){
    
            try {
                //只会被调用一次
                System.out.println ("init被调用");
    
                //添加网页访问次数的功能
                //创建一个FileReader
                FileReader f=new FileReader("e://myDocument.txt");
                BufferedReader br=new BufferedReader(f);
                //读出一行数据
                String numVal=br.readLine();
                //一定要关闭文件流
                br.close();
                int times=Integer.parseInt(numVal);
                //将times值放入到servletcontext
                this.getServletContext().setAttribute("visitTimes",times+"");
                }
                catch (Exception ex) {
                }
        }
    
        //重写destroy函数,destroy函数在tomcat关闭的时候被调用,要用shutdown.bat关,不能直接叉掉tomcat窗口
        public void destroy(){
            try {
                System.out.println ("destroy被调用");
    
                //再将新的次数写回去
                FileWriter fw=new FileWriter("e://myDocument.txt");
                BufferedWriter bw=new BufferedWriter(fw);
                bw.write(this.getServletContext().getAttribute("visitTimes").toString());
                bw.close();
                }
                catch (Exception ex) {
                }
        }	

    在login登录页面添加上面的代码,就能在每次登录的时候执行一次读取文件操作,在tomcat关闭的时候执行一次写文件操作。

  • 相关阅读:
    面试题目
    MyEclipse 启动 tomcat时错误处理
    js 剪贴板操作
    PHP面试题
    MySQL 数据库 source 导入乱码
    php 不用通过表单也能创建HTTPpost请求
    一个css中zindex的用法
    最新黑链代码expression:隐藏链接代码
    测试网站访问速度的几个小方法
    优秀开源外贸网店程序一览
  • 原文地址:https://www.cnblogs.com/xiangkejin/p/5693164.html
Copyright © 2011-2022 走看看