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

我昨天写一个图像跟踪的Web Application的过程

 
阅读更多
昨天闲着无聊,2点左右开始犯困,想起来得有个把星期没写程序了,写点程序提提神吧^_^。
随便想想,就写个图像跟踪吧,把一个貌似图形的url复制到论坛上或者别的网页上,如果被自动加上<img src="一个定制的url" />,那么浏览器就会自动请求这个url,然后,我的服务器就会记住这个访问者。相当与是跟踪了哈。和“一统天下”的统计原理网站访问量的原理是一样的。
核心代码:把请求内容定义为图片,并且从默认流传输出去。核心代码很少,加上注释,不过100行+。使用java实现的话,就是写一个servlet,然后把这个servlet的url-partrern定义为*.jpg,呵呵,这就实现了移花接木的功能了,每次对jpg文件的请求,都会被转移到那个servlet里,然后在doGet或者doPost方法里面,就能够得到HttpServletRequest对象,然后你愿意记录什么就随意了,当然,最后别忘了把图像给人家传过去^_^。
方案一:最简单的方案,不使用数据库,使用文件保存访问记录,把所有的处理都放在doGet或者doPost里面。最简单,最不灵活。半个小时就能搞定。调试部署也就是一个小时-。
方案二:使用数据库记录访问记录。这样就要安装mysql,把数据库驱动jar放到正确的位置,还要建立数据表,在应用中建立连接操作数据库,写sql语句,释放资源等等。这些东西还是都写在doGet或者doPost里面,这时候已经比较乱了……。大概要多用半个小时。数据存储的还行,但是不具有扩展性。
我是从下面这个方案开始做的。
方案三:配置并使用数据连接池,建个表保存数据,同时:
建立类DBConnectionManager,用来连接数据源,getConnection方法。
建立类DBUtil,用来封装数据库操作,executeUpdate,executeQuery等。
建立类DataUtil,用来处理判断数据合法性。
建立类TrackData,将访问记录保存为一个类,包含三个字段,并且利用DataUtil,将数据类写成一个DAO。
然后,在doGet或者doPost里面加上:
TrackData ip = new TrackData(request, response);
ip.saveTrackData();
就ok了。
写完,测试,成功!因为已经进行了多次数据源配置,并且DBConnectionManager,DBUtil等类已经在别的地方写过,直接拖过来用的,大概时间用了一个半小时+。
改进:添加过滤ip列表(不用保存自己访问的记录),定义图像文件缓存(应对大访问量,呵呵)。
添加messages.properties
passedIP=127.0.0.1 211.87.227.95 211.87.209.99
imageRoot=C://Tomcat5x//webapps//TrackYou//images
imageNames=clover.jpg
添加类Messages,封装对messages.properties的操作。
保存访问记录的那段代码就成了:
TrackData ip = new TrackData(request, response);
if(DataUtil.isPassedIP(ip.getIP())){
return;
}
ip.saveTrackData();
改起来很繁琐,但是还是ok了,用了半个多小时。
方案四:然后觉得不爽,这样限制的太死了,于是想到了模仿事件驱动。
添加接口:VisitEvent,里面只有一个方法:onVisit,在在doGet或者doPost的时候触发此事件。
添加类VisitListen,实现接口VisitEvent。在onVisit方法里保存访问记录。
在Servlet里添加List VisitEventList,保存事件接口。
最大的麻烦就是添加事件监听,因为是Web Application,控制权在Tomcat手里,我无法决定怎么时候加载一个类,也就没办法控制什么时候执行static{}块。又不想把初始化的static{}块乱放。
于是添加Servlet:InitApplicationServlet,然后规定<load-on-startup>0</load-on-startup>,唯一作用就是执行static{}块,初始化应用程序。
static{
InitApplication();
}
到这里,算是比较完美了。
写完,发现核心的东西其实并不是最重要的,重要的是周边的。核心的东西,就好像OpenGL库,要想做出点东西,周边的东西是很重要的。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics