• ServletContext实现网站计数器


    在网站开发中,有很多功能需要使用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>" );


  • 相关阅读:
    WebClient, HttpClient, HttpWebRequest ,RestSharp之间的区别与抉择(几种Http请求方法)
    关于c#里面的httpclient的调用
    mvc项目架构分享系列之架构搭建初步 架构搭建初步
    关于在.NET中 DAL+IDAL+Model+BLL+Web
    三层架构(DAL/BLL/UI)和MVC设计模式的关系
    c#开发初学者之mvc及架构分层
    c#串口编程(转)
    【WPF】对话框/消息弹窗
    WPF如何不显示最大化,最小化的按钮
    信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1103:陶陶摘苹果
  • 原文地址:https://www.cnblogs.com/archermeng/p/7537052.html
Copyright © 2020-2023  润新知