当前课程知识点:Web后端开发技术 > 第7章 Filter和Listener > 7.2 监听器 > 7.2.1.2示例:访问网站计数功能
同学你好
今天我们学习这个知识点
给大家演示一个我们访问网站计数
然后如果我们的服务器关闭了
那么这个计数它能够保存起来
保存到一个文件当中
或者保存到数据库当中
当这个服务器在启动的时候
我原先的计数会从我们的文件或者是
数据库当中再读回来
当然了
这里面我们是以文件为主
好
首先我们打开我们的eclipse
首先我们要监听我们的
servletContext这么
一个listener
也就是说我们的
servletContext启动的时候
我们要从文件当中把这个数据给给他
读取出来
如果当它销毁的时候
我们要把当前的计数存到我们文件
当中
好
现在我们先去建立一个
listener
我们点击new一个
listener
这个listener我们叫做
VisitCountListener
这时候我们要去实现的就是
servletContextListener
这样的一个接口
点击
Finish
那么在这个接口里面
我们主要是当它初始化的时候
我们要把计数给它读出来
当它销毁的时候
我们把当前的计数给它存到那个文件
当中
我们先去实现
initialized这个方法
那么假如说我们有一个文件在
这里src一下
我新建一个普通的文本文件
我们就new一个普通的文本文件
我们的点击src选择
general下面的file
点击next
我们叫做count.
txt
finish
那么这里面就存着我当前的一个计数文件
比如说我这里随便写一个30
表示我当前已经有了30个访问了
那么当我服务器启动的时候
我要把它读进来
那么首先我先通过我管它叫sce
sce
我可以拿到我的servletContext
上下文
servlet
context
我叫做context这么一个对象
好了
然后我通过文件读取的方法
我叫做BufferedReader
好
我new一个我的BufferedReader
这都是我们文件里面读取
读取文件的API
new一个inputStreamReader
那么inputStreamReader里面
我们需要传入
我们这个文件在哪儿
我可以通过我的context对象
.get
resource
AsStream
直接在我的根目录下有一个叫做
count.txt这样就可以了
那么读进来以后
我就可以通过
因为我只有一行
我就直接通过reader.readLine
给它读进来
它是一个count类型
会发生异常
我就直接给它进行一下处理
try catch
好了
然后我判断一下
如果我们的count是空
或者是这样的空
那么我就让count初始化
成一个值是
0就可以了
最后我需要把 count给它转
换成整型的
countInt
叫做integer.
给它转换成我们整形的 count
因为之前它是字符串类型的
然后我给它保存到我们的对象当中
context. 我们用set
Attribute
count
我们的countInt
那么不要忘了我们刚才读完这个文件了
我们要把我们的对应的文件
都给它关掉
.close
所以说这个逻辑就是我们一旦服务器
启动
我从我 count.text当中
把我之前保存的计数给读取出来
那么我的销毁的时候
也就当我服务停止的时候
是不是与它相反的一个过程
我当前计数给写入到我 count.txt当中
把原先值给覆盖掉就可以了
所以说我们这块代码就很清晰了
我们通过还是这句话
拿都servletContextt对象
拿到这个对象以后
我们还是要取出来对象当中的integer值
我们通过context.get
attribute
我们count值
当然 count值它是一个
integer类型的了
我们对它进行取出
那么有了这个计数以后
我们就要判断一下这个计数是不是为空
如果为空
我们程序可能会出现错误
所以它不为空的情况下
我们就给它写入到文件里面
通过printWriter
这个对象
那么在printWriter
这个对象里面
我们要构造我们的文件的路径
我们可以通过 context.get
我们的realPath
连接上我们的 count.txt
这时候就把这个路径给构造出来了
然后我可以通过 pw.
println方法
我们把我当前的 count值给写进去
Int value
这个异常我们对它进行捕获一下
out加1
这时候如果这个服务启动
就会对按我的contextdestroyed
销毁以后
然后这个值就会写在我们的
count.txt当中
这count.txt我
应该给它搁到 WEB-INF
下面
归到 src下了
删除掉
好
我们先测试一下
为了方便调试
我在这里先
打印一下我的count信息
在我初始化的时候
读出来以后
我打印一下我 countInt的值
是多少
好
我们启动我们的服务
启动服务
这个方法就会被执行
然后就会打印出我们当前的
countInt
启动
大家可以看到了
在这里面就会有一个30
当我销毁的时候
这个30就会写回去
比如说我现在人为的把30给他删去
它这里什么都没有
好
我正常停止服务
待会我们再看一下这个文件里有没有东西
停止
好
现在服务已经停了
我们再打开这个文件
它没有写入
我们来看一下代码
之所以写错了是这个原因
我在写初始化的时候
我是刚才把 count.txt
我是搁到 src下读的
而我写回去的时候
我刚才把 count.txt搁到
webContent下面了
它读的是两个不同的东西
所以说你给统一起来
我们就改一下contextInitialized
这时候这种读的方法它是从src下读的
我们还是从 都统一成从
webContent下面读
所以说这时候我改变一下
这块 ctrl c
我用了一个叫做
new一个叫FileReader
FileReader里面我们
写这个路径是我们的实际路径
下面的 count.txt
它就会读这个txt文件
为了处理这个异常
我搁到 try catch里面
这时候就不会有任何问题了
那么我们count.txt默认情况下是
30
我们重新启动
它这里读出来的是0
我们看一下它实际部署到是这个目录
部署到这个目录以后
大家会发现这个coun.txt里它什么都没有
那么出现这个问题可能是它一个
eclipse的问题
我们可以怎么办
把这个项目给它首先把服务停掉
把服务停掉
然后我们把这个项目给他移除掉
然后再把这个项目我们重新进行一下
部署
重新我去部署一下
第7章
然后这是实际它部署的那个目录
那么我们给它重新启动一下
大家可以到部署目录里面第7章内容
都有了
可以看一下
现在是30
然后把这个值给改掉
比如说什么都没有吧
那么这时候销毁的时候
我服务一停掉的时候
它是不是就应该把我已经存在我应用里的
缓存的值30再给写回去
那么我们确认一下
这里面确实啥都没有
啥都没有
我们现在把服务停掉
可以看到停掉了
那么我们打开这里边
如果啥都没有
大家可以到目录下,它实际部署的目录
下面去看
它这里也没有写入
没有写入
没关系
我们为了确认一下这个值
我们在这里面去打印输出它一下
叫做 count值
好
保存
我们先重新给他一个值30
然后我们重新启动一下这个服务器
好
这时候30这个值是有的
把30值删掉
然后我们关掉这个服务器
我们来看一下 countDestroyed方法写的
因为我们用的是printwriter
当我们写完以后没对它进行关闭
它还在内存当中
没有真正的往文件上写
所以说我们需要调用一下它的关闭方法
这时候它里面的缓存才会真正的
写入到文件当中
那我们在 count里面
我们还是初始化成它的30
大家一定要理解
当我这个项目真正运行的时候
实际上是
它编译运行完以后
部署到的是我们实际的这个目录下
在之前的课程当中
我们也找过这个目录在哪个位置
那么这里面实际上它拷贝过来一份
这点大家一定要注意
为什么这么说
现在我这是30
这时候 count和我那里的
count是同一个count
所以说是都是30
当我启动服务器
它可以从 count当中进行读取
读完以后
注意我把我30删掉了
当然了这块30跟着也就删掉了
也就什么都没有了
那么当我关闭的时候
它是不是要往我 count里写
但是它往count写的是哪个
count.txt
写的是往我这份里写的
count.txt
而我项目里这份是没有动的
所以说我们查的时候要查那一份
count.txt
好
关闭
关闭完以后
我们找到我们实际部署的count.txt
我们看一下
是30没有问题
是因为我刚才没有进行把把这个删除
我给大家再重新把整个演示一遍
我以debug方式去启动我们的
服务
initialized这块我们给它
跳过去
整个执行完
这样的话从我们的数据里面就读取了
30
我们为好为了更好的演示
destroy这一块
我们在这加一个断点
然后我们把 count数值给它
删除掉
这里没有了
现在我关闭我的服务
大家可以看到断点已经到这了
我依次执行
所以说这个值已经读出来了
这个值又再一次读出来
count这个值读出来
然后重新写回到这个文件
给它关闭掉
这个程序就整个执行完了
那么我们可以看一下我们
Count.txt
30这个值就回来了
那么是在实际应用当中
是不是我有其他的程序
然后不断的往我Context里面
这个对象里面
去增加我 count值
那么一旦我这个服务器服务关闭
contextDestroy这个方法就会被调用
那么我们取出来最新的 count值
就会被重新写到我这个文件当中
从而得到了保存
这个知识点就讲到这里
谢谢
-1.0 导学
--1.0.1 导学
-1.1 Web应用开发概述
--1.1.3 测试
-1.2 准备Java Web应用开发环境
--1.2.2 测试
-1.3 任务实现:Hello World Web项目
--1.3.2 测试
-1.4 小结
--1.4.1 小结
-本课程所有代码
--课程参考代码
-2.0 导学
--2.0.1 导学
-2.1 Servlet概述
--2.1.3 测试
-2.2 创建Servlet
--2,2,3 作业
-2.3 Servlet应用
--2.3.4 测试
-2.4 任务实现:某高校毕业生信息发布系统-注册与登录(Servlet版)
--2.4.3 测试
-2.5 ServletConfig接口
-2.6 ServletContext接口
-2.7 HttpServletRequest接口
--2.7.5 测验
-2.8 HttpServletResponse接口
--2.8.3 测试
-2.9 任务实现:某高校毕业生信息发布系统-简历添加
--2.9.1 任务实现:某高校毕业生信息发布系统-简历添加
-2.10 小结
-动画演示:Java Web应用服务器处理客户端请求的过程
-3.0 导学
--3.0.1 导学
-3.1 Cookie技术
--3.1.3 测试
-3.2 Session技术
--3.2.2 Session技术-Session技术应用购物车
--3.2.3 测试
-3.3 URL重写与隐藏表单域
--3.3.2 测试
-3.4 任务实现:某高校毕业生信息发布系统-简历修改
--3.4.1 任务实现:某高校毕业生信息发布系统-简历修改
-3.5 小结
--3.5.1 小结
-4.0 导学
-4.1 jsp概述
--4.1.2 测试
-4.2 脚本元素
--4.2.2 测试
-4.3 指令元素
--4.3.2 测试
-4.4 动作元素
--4.4.3 测试
-4.5 内置对象
--4.5.3 测试
-4.6 JavaBean
--4.6.3 测试
-4.7 任务实现:某高校毕业生信息发布系统-首页(JSP版)
--4.7.1 任务实现:某高校毕业生信息发布系统-首页(JSP版)
-4.8 小结
--4.8.1 小结
-5.0 导学
--5.0.2 测试
-5.1 el语法
--5.1.2 测试
-5.2 el隐含对象
--5.2.2 测试
-5.3 任务实现:某高校毕业生信息发布系统-学生详细信息展示
--5.3.1 任务实现:某高校毕业生信息发布系统-学生详细信息展示
--5.3.2 测试
-5.4 小结
--5.4.1 小结
-6.0 导学
--6.0.2 测试
-6.1 核心标签库
--6.1.5 测试
-6.2 任务实现:某高校毕业生信息发布系统-首页(JSTL版)
--6.2.1 任务实现:某高校毕业生信息发布系统-首页(JSTL版)
--6.2.2 测试
-6.3 小结
--6.3.1 小结
-7.0 导学
--7.0_导学
-7.1 过滤器
--7.1.3 测试
-7.2 监听器
--7.2.1.1与ServletContext相关的监听器
--7.2.4 测试
-7.3 任务实现:某高校毕业生信息发布系统-单态登录
--7.3.1 任务实现:某高校毕业生信息发布系统-单态登录
--7.3.2 测试
-7.4 小结
--7.4.1小结
-8.0 导学
--8.0_导学
-8.1 JDBC API
--8.1.2 测试
-8.2 JDBC API访问MySQL基本步骤
--8.2.2 测试
-8.3 任务实现:某高校毕业生信息发布系统-注册与登录
--8.3.1 任务实现:某高校毕业生信息发布系统-注册与登录(JDBC版)
--8.3.2 测试
-8.4 小结
--8.4.1小结
-9.0导学
--9.0导学
-9.1 技术准备
--9.1.5 测试.
-9.2 系统设计
-9.3 系统实现
-9.4 小结
--9.4.1小结


