`
txf2004
  • 浏览: 6885689 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

如何实现图像访问计数器

阅读更多

统计和显示页面的访问次数是一个常见的WEB应用,因为在网页每次被访问时,页面的访问次数都要发生改变,所以这个功能必须通过服务器端的程序来实现。页面访问计数器在服务器端的基本执行过程为:首先从数据库或其他存储系统中取出页面原来的访问次数,然后将原来的访问次数加1后再作为当前访问次数送给浏览器显示,同时将当前访问次数存储回数据库或其他存储系统中,以便下次访问该页面时使用。但是,一些WEB站点只能输出静态页面内容,没有开放运行服务器端程序的功能。例如,一些提供免费网页空间的站点,在客户端访问任何类型的文件时,服务器都会原封不动地输出给浏览器去处理,显然无法直接在这些只支持静态内容的WEB站点上编写服务器端程序来实现页面访问次数的统计和显示功能。于是,一些具有执行服务器端程序功能的WEB站点推出了免费的页面访问计数器,只要在位于任何站点的一个静态HTML页面中增加一条该站点提供的HTML语句,该语句就能显示出该静态页面的访问次数,从而帮助静态HTML页面实现了访问次数的统计和显示功能。一个站点要想能统计另外一个站点上的某个HTML页面的访问次数,必须让任何一个浏览器在每次访问那个HTML页面都通知这个一下站点,这可以通过在静态HTML页面中增加两种特殊的标签来实现:<img>标签和设置src属性的<script>标签。下面只分析使用<img>标签的应用情况,对于使用设置src属性的<script>标签的应用情况,则作为一道习题交给读者自己去完成。

要利用<img>标签为静态HTML页面实现访问次数的统计和显示功能,需要理解<img>标签的三个重要特性:

1)一个包含有图像的网页文件中并没有包含真正的图像数据内容,而只是使用<img>标签指明了图像的URL地址,如下所示:

本网页已被浏览了<img src= "count.gif ">

如果浏览器在解析网页文档的过程中遇到了<img>标签,它根据<img>标签的src属性所指定的URL地址去访问WEB服务器,从WEB服务器上获取图像数据后,再在<img>标签的位置处显示出来。

2<img>标签的src属性也可以指向当前页面所在WEB服务器之外的其他WEB服务器上的图像文件。

3)浏览器并不关心<img>标签所需的图像数据在服务器端是如何产生,它只知道去访问src属性指定的URL资源,并把服务器返回的数据当作一个图像的内容来显示。服务器返回的图像数据可以直接从一个静态图像文件中读取,也可以通过Servlet程序在内存中动态创建。所以,<img>标签的src属性指向的URL不一定非得是事先静态存在的静态图像文件,也可以是一个Servlet程序。

在静态HTML页面中使用<img>标签实现免费页面访问计数器的工作原理如图5.17所示,WEB站点A上的静态页面count.html内有一条<img>标签语句,<img>标签的src属性指向了WEB站点B上的一个名为CountServletSerlvet程序,当浏览器显示从站点A上获得的count.html页面时,它将根据其中的<img>标签的src属性去访问WEB站点B上的CountServlet程序以获得要显示的图像数据,CountServlet则创建出具有该页面的访问次数的图像回送给浏览器显示。

<shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 368.25pt; HEIGHT: 236.25pt" type="#_x0000_t75"><imagedata src="file:///C:%5CDOCUME~1%5Cgaocao%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.png" o:title='耠"耨"X'></imagedata></shape>

5.17

因为WEB站点B上并不存在客户端要访问的图像文件,而是由Servlet程序在内存中临时动态生成图像内容后传送到客户端的,所以,尽管静态页面内的<img>标签所指向的这个Servlet程序的URL地址是固定不变的,但是,它每次被访问时所返回的图像内容却是可以不断变化的。

要编写一个用<img>标签统计和显示静态HTML页面的访问次数的Servlet程序,需要考虑以下一些技术细节:

l Servlet程序输出的图像格式为jpeg,所以,它应告诉浏览器其所输出的实体内容的MIME类型为image/jpeg,浏览器才会将它所接收到的数据当作一个图像进行处理。

l 因为图像是二进制数据,所以应该调用HttpServletResponse.getOutputStream方法返回的ServletOutputStream对象来向客户端写入图像数据,而不应使用HttpServletResponse.getWriter方法返回的PrintWriter对象。

l java.awt.image.BufferedImage类用于在内存中创建一幅图像,具体的图像内容则可以通过调用其图形上下文对象(java.awt.Graphics)的各种绘图方法生成,这里仅仅需要绘制一串数字,调用Graphics.drawString方法即可。BufferedImage类创建的内存图像的初始背景颜色和绘图颜色都是黑色的,如果想改变背景颜色,还需要先设置相应的绘图颜色,然后调用Graphics.fillRect填充整个背景。

l 在内存图像中绘制访问次数时,必须限定显示的位数,如果访问次数超过七位,则用数字9999999显示,如果访问次数不足七位,则在前面补充相应个数的0

l 每个引用该Servlet程序的静态页面的URL都对应一个各自的访问次数,每个URL及其访问次数需要使用数据库系统来进行存储,对于简单的实验,也可以采用一个属性文件来进行存储。程序首先使用Referer请求头获得当前引用页面的URL,然后去数据库或属性文件中检索该URL的访问次数,再将访问次数加1后保存进数据库或属性文件,并将访问次数绘制在内存图像中。如果属性文件中不存在该URL的信息,则说明该URL页面属于第一次统计访问。关于如何获得Referer请求头,请参看6.4节的讲解。

l JDK中提供了一个javax.imageio.ImageIO类,它的write方法可以将BufferedImage对象中的图像编码成jpeg格式的图像数据后写入到一个OutputStream流对象中。因此,只需要调用ImageIO.write方法将BufferedImage对象中的图像编码成jpeg格式后写入到ServletOutputStream流对象中,就将整个图像数据输出给了客户端。

:动手体验:使用<img>标签实现静态HTML页面的访问次数统计和显示

1)编写一个能统计静态HTML页面的访问次数和将访问次数以图像形式返回给客户端的Servlet程序,每个页面的URL及访问次数用一个属性文件进行存储,如例程5-10所示。

例程5-10 CountServlet.java

<wrap side="left"><font face="Times New Roman" size="3"></font></wrap>


import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

import java.awt.*;

import java.awt.image.*;

import javax.imageio.ImageIO;

import java.util.Properties;

public class CountServlet extends HttpServlet

{

public void doGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException,IOException

{

response.setContentType("image/jpeg");

//设置浏览器不要缓存此图片

response.setHeader("Pragma","No-cache");

response.setHeader("Cache-Control","no-cache");

response.setDateHeader("Expires", 0);

ServletOutputStream sos = response.getOutputStream();

BufferedImage image =

new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);

Graphics g = image.getGraphics();

/*g.setColor(Color.BLACK);

g.fillRect(0, 0, width, height);*/

g.setColor(Color.WHITE);

g.setFont(new Font(null,Font.ITALIC|Font.BOLD,18));

String value = getAccessCount(request);

int len = value.length();

//最大访问次数不能超过9999999

if(len > 7)

{

value = "9999999";

}

else

{

String tmp="";

for(int i=0;i<7-len;i++)

{

tmp = tmp +"0";

}

value = tmp + value;

}

g.drawString(value,0,18);

//结束图像的绘制过程,完成图像

g.dispose();

ImageIO.write(image, "JPEG", sos);

sos.close();

}

private String getAccessCount(HttpServletRequest request)

{

//得到引用页面的URL地址,并以此作为访问次数的检索关键字

String pageKey = request.getHeader("referer");

if(pageKey == null)

{

return "0";

}

Properties settings = new Properties();

//count.txt等内部文件最好是保存在WEB-INF目录中

String countFilePath = getServletContext().getRealPath("/count.txt");

try

{

//下面的语句没有使用close方法关闭流,有缺陷!

settings.load(new FileInputStream(countFilePath));

}

catch(Exception e){}

String count = "0";

try

{

count = settings.getProperty(pageKey);

if(count == null)

{

count = "0";

}

int c = Integer.parseInt(count) + 1;

count = new Integer(c).toString();

settings.put(pageKey,count);

//下面的语句没有使用close方法关闭流,有缺陷!

settings.store(new FileOutputStream(countFilePath),

"the page is accessed:");

}

catch(Exception e)

{

System.out.println(e.getMessage());

}

return count;

}

}

<wrap side="left"><font face="Times New Roman" size="3"></font></wrap>


编译CountServlet.java源文件,确保编译后生成的class文件存放在了<tomcat的安装目录>\webapps\it315\WEB-INF\classes目录中。

2)修改<tomcat的安装目录>\webapps\it315\WEB-INF\web.xml文件,在其中的相应位置处增加如下两段内容:

<servlet>

<servlet-name>CountServlet</servlet-name>

<servlet-class>CountServlet</servlet-class>

</servlet>

……

……

<servlet-mapping>

<servlet-name>CountServlet</servlet-name>

<url-pattern>/servlet/CountServlet</url-pattern>

</servlet-mapping>

保存web.xml文件后,重新启动Tomcat

3)在任何计算机上的任何HTML页面中只要加入如下语句:

<img src="http://可对外访问的主机地址:8080/it315/servlet/CountServlet">

就可以统计和显示该页面的访问次数了。在<tomcat安装目录>\webapps\it315目录中编写一个名为count.htmlhtml文件,如例程5-11所示

例程5-11 count.html

<wrap side="left"><font face="Times New Roman" size="3"></font></wrap>


<meta http-equiv="Content-Type" content="text/html;charset=GB2312">

本网页已被浏览了<img src="http://localhost:8080/it315/servlet/CountServlet">次。

<wrap side="left"><font size="3"></font></wrap>


在浏览器地址栏中输入如下地址:

http://localhost:8080/it315/count.html

浏览器中显示的结果如图5.18所示。

<shape id="_x0000_i1026" style="WIDTH: 363.75pt; HEIGHT: 201pt" type="#_x0000_t75"><imagedata src="file:///C:%5CDOCUME~1%5Cgaocao%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image004.png" o:title=""><font size="3"></font></imagedata></shape>

5.18

刷新浏览器的访问几次,可以看到图片中的数值随之增长。

分享到:
评论

相关推荐

    Visual+C#+2008程序设计经典案例设计与实现.rar

    Visual+C#+2008程序设计经典案例设计与实现 第1章 Visual C#2008与窗体界面 案例1 飘动动画窗体 案例2 透明动画窗体 ...案例4 利用Application对象实现网站计数器 案例5 利用Session对象实现留言板 本章小结

    Visual C# 2008程序设计经典案例设计与实现

    目录: 第1章 Visual C#2008与窗体界面 案例1 飘动动画窗体 案例2 透明动画窗体 案例3 利用API函数实现动画窗体 ...案例4 利用Application对象实现网站计数器 案例5 利用Session对象实现留言板 本章小结

    C#设计经典案例设计与实现

    第1章 Visual C#2008与窗体界面 案例1 飘动动画窗体 案例2 透明动画窗体 案例3 利用API函数实现动画窗体 案例4 闪烁动画窗体 ...案例4 利用Application对象实现网站计数器 案例5 利用Session对象实现留言板 本章小结

    javascript入门图片对象(无刷新变换图片)\滚动图像

    代码如下:&lt;&#37;@LANGUAGE=”JAVASCRIPT” CODEPAGE=”936″%&gt; &lt;!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” ... &lt;head&gt; &lt;... charset=gb2312″ /&gt;...图片

    使用JavaScript制作一个简单的计数器的方法

    设计思想  该方法的关键是Cookie技术和动态图像特性的...通过把Web页中的图像映射到一个Images数组,一定条件下修改该数组项的特性,可以实现动态图像显示。本例中,首先预载入一组图像,每次调用该Web页时,随机产生

    PHP动态网页设计与制作案例教程

    本书展示一个完整网站的设计和实现过程,详细地介绍动态网页设计和制作的技术和相关理论,全书共分为8章,主要内容包括:动态网站设计概述、动态网站编程环境、网站主页设计与PHP基础、网站计数器设计与PHP文件访问...

    《Visual C# .NET精彩编程实例集锦》配套光盘文件【全】

    实例101 如何实现动态显示图像 实例102 如何以旋转方式显示文字 实例103 如何在图像中添加文字 实例104 如何以图像填充文字线条 实例105 如何实现图形绘制拉伸效果 实例106 如何控制图像的显示方式 实例107 ...

    Visual C# .NET精彩编程实例集锦

    实例101 如何 实现动态显示图像 实例102 如何以旋转方式显示文字 实例103 如何在图像中添加文字 实例104 如何以图像填充文字线条 实例105 如何 实现图形绘制拉伸效果 实例106 如何控制图像的显示方式 实例107 如何...

    C# 源码 C#2008经典案例

    第1章 Visual C#2008与窗体界面 案例1 飘动动画窗体 案例2 透明动画窗体 案例3 利用API函数实现动画窗体 ...案例4 利用Application对象实现网站计数器 案例5 利用Session对象实现留言板 本章小结 ......

    PHP经典100例.

    64图像函数 65session函数 66拼写检查 67循环中调用函数 68转换所有的标记为PHP 69取得页面的链接 70对分查找法 71文件上传界面 72用PHP4实现顶级域名查询 73日期合法性检查 74检查一个邮政编码 75得到100个随机...

    VC++.NET案例开发集锦源代码.part1

    案例2 基数转换计数器 案例3 打印杨晖三角形 案例4 确定一个月的天数 案例5 石头、剪子、布猜拳游戏 案例6 创建动态菜单 案例7 创建工具栏 案例8 递归与全局变量的案例1-打靶程序 案例9 调用VC++.NET中数学...

    Visual C#.NET 2008程序设计案例集锦 (源码)

    案例10.4 利用Application对象实现网站计数器 案例10.5 利用Session对象实现留言板 案例10.6 动态上传图像并显示 案例10.7 利用控件显示数据库表中的数据 案例10.8 分页显示数据库表中的数据 案例10.9 动态选择...

    ASP200问.EXE

    59.如何使用Counters组件实现网站访问人数统计 60.如何使用ASPPing组件 61.如何使用ASPHttp组件 62.如何用Visual Basic编写ActiveX DLL及其使用 63.如何远程注册DLL文件 64.如何把ASP代码编写成DLL文件 65.如何在ASP...

    C#源码大集合 02(共3卷)

    │ │ ├─实例101 如何实现动态显示图像 │ │ ├─实例102 如何以旋转方式显示文字 │ │ ├─实例103 如何在图像中添加文字 │ │ ├─实例104 如何以图像填充文字线条 │ │ ├─实例105 如何实现图形绘制拉伸...

    object c/iphone 开发 试题

    Frameworks:特殊的库,可以存放库、框架、图像、声音等资源; Products:包含项目在编译时生成的应用程序(xxx.app); 10.Info.plist文件里的bundle identifier(束标识符) 它是应用程序的唯一标识符,要始终配置,...

    C#源码大集合 01(共3卷)

    │ ├─实例112 如何以任意比例转换图像大小 │ │ ├─实例88 如何实现大图像浏览 │ │ ├─实例89 如何实现多图像浏览 │ │ ├─实例90 如何以反色方式显示图像 │ │ ├─实例91 如何以浮雕方式...

    C#源码大集合 03(共3卷)

    │ ├─实例112 如何以任意比例转换图像大小 │ │ ├─实例88 如何实现大图像浏览 │ │ ├─实例89 如何实现多图像浏览 │ │ ├─实例90 如何以反色方式显示图像 │ │ ├─实例91 如何以浮雕方式...

    PrestaShop v1.7.1.1 中文版.zip

    - #7570:主题重置后的通知,关于图像再生的警告; - #7576:删除无用的meta_title; - #7573:产品页面模块标签上的两个字样; - #7551:还原已编译资源; - #7516:在钩子模块exec列表之前检查钩子是否...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例271 清理SESSION缓存提高网站访问的效率 358 第6章 图形图像处理 361 6.1 图像与统计 362 实例272 图形计数器 362 实例273 GD2图形计数器 363 实例274 通过图像显示投票统计结果 365 实例275 通过图像显示密码...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例271 清理SESSION缓存提高网站访问的效率 358 第6章 图形图像处理 361 6.1 图像与统计 362 实例272 图形计数器 362 实例273 GD2图形计数器 363 实例274 通过图像显示投票统计结果 365 实例275 通过图像显示密码...

Global site tag (gtag.js) - Google Analytics