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>" );
ServletContext实现网站计数器的更多相关文章
- ServletContext与网站计数器
什么是ServletContext? ServletContext是服务器的一个公用的空间,是不同的浏览器共享的一个数据. 由图可以看出ServletContext和Cookie与session之间的 ...
- ServletContext结合Servlet接口中的init()方法和destroy()方法的运用----网站计数器
我们一般知道Servlet接口中的init()方法在tomcat启动时调用,destroy()方法在tomcat关闭时调用.那么这两个方法到底在实际开发中有什么作用呢?这就是这个随笔主要讲的内容. 思 ...
- application 网站计数器
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- Histats安装Counter网站计数器 - Blog透视镜
Histats提供十分多样性的Counter网站计数器,可以依照你个人的喜好与需求,选择适合的Counter网站计数器,也可以针对同一网站,安装多个Counter网站计数器,作法其实比注册账号时更简单 ...
- Histats申请Counter网站计数器 - Blog透视镜
为了计算网页被浏览的次数,访客人数等统计数据,作为未来分析之用,可以向Histats申请免费的Counter网站计数器,它的功能相当齐全,同时也会保留一段时间的资料,当作统计比较的资料,更可以进一步付 ...
- servlet-servletContext网站计数器
1.在项目中新建文件夹新建文件nums.txt 2.在web.xml文件配置 <servlet> <description>This is the descriptio ...
- zabbix添加IIS网站计数器(并发连接数)详解
环境:windows server 2012 前提:IIS上要添加好配置 1,在被监控主机,powershell输入perfmon.msc 2,点击添加按钮 3,在下拉菜单中点击小箭头 ...
- Servlet之ServletContext以及文件操作
ServletContext ------------------------------------ ServletContext是什么? 与cookie,session比较. 可以把它想象成一个共 ...
- 【jsp网站计数功能】 application session
在jsp页面中实现网站计数器的方法有很多,其中比较普遍的做法是利用application 和session对象.application对象可被所有用户共享:session是单用户共享,用户从访问系统开 ...
随机推荐
- 【LeetCode】反转每对括号间的子串
[问题]给出一个字符串 s(仅含有小写英文字母和括号). 请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果. 注意,您的结果中 不应 包含任何括号. 示例 : 输入:s = ...
- gdb 常用选项
gdb 常用选项 help:查看命令帮助,具体命令查询在gdb中输入help + 命令,简写h run:重新开始运行文件(run-text:加载文本文件,run-bin:加载二进制文件),简写r st ...
- UVA - 11134 Fabled Rooks(传说中的车)(贪心)
题意:在n*n的棋盘上放n个车,使得任意两个车不相互攻击,且第i个车在一个给定的矩形Ri之内,不相互攻击是指不同行不同列,无解输出IMPOSSIBLE,否则分别输出第1,2,……,n个车的坐标. 分析 ...
- 每天一点点之laravel框架开发 - API通过access_token获取用户id报 Unauthenticated. 错误(passport)
1.首先保证你的config/auth.php 中 guards 的 api 的 driver 选项改为 passport 2.注册中间件,在 app/Http/Kernel.php 文件中的 $ro ...
- multi-layer perceptrons, MLP)模型,CvANN_MLP。
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <ope ...
- 7 ~ express ~ body-parser 模块的使用
一,安装 : npm install body-parser 二,加载 : var bodyParser = require('body-parser') 三,配置 : https://github. ...
- 将java项目转成svn项目
1.需要工具:eclipse / svn插件 2.在需要共享的项目上右键-->team-->Share Project分享项目 3.选择svn 如果需要共享成cvs选择cvs即可. 4.选 ...
- oracle数据库语言(2)----数据操作语言
DML(数据操纵语言)Data Manipulation Language 用于增.删.改 数据库中的数据 常伴随着TCL(事物操作语言)----commit(保存):rollback(回滚): ), ...
- SQL的7种连接查询详细实例讲解
SQL的7种连接查询详细实例讲解 原文链接:https://mp.weixin.qq.com/s/LZ6BoDhorW4cSBhaGy8VUQ 在使用数据库查询语句时,单表的查询有时候不能满足项目的业 ...
- zoj 2314Reactor Cooling
秘制神奇上下界网络流%%% 什么什么有(木)源汇可行流什么的,,看不懂(一下纯属个人sb言论) 看了半天知道点,一个点u,从S连到u的流量是全部流入u的下界,u到T是全部流出u的下界和.(进去出来的约 ...