在上一篇文章“过滤器应用”中我们提到过Servlet一共有三种:简单Servlet、过滤Servlet和监听Servlet,和大家一起学习过了前两种Servlet之后,我们再一起来学习第三种Servlet--监听Servlet(监听器)
监听器
对某一些操作进行监听,就成为监听器,比如:有人走过,被摄像头拍下,这就是监听,很好理解。
在WEB 中的监听主要的功能是用于对ServletContext、session、Request进行监听的一种操作
当相关事件触发之后将产生事件,并对此事件进行处理。
对application进行监听
application是ServletContext接口的对象,表示的是整个上下文的环境
如果要想实现对application监听,则可以使用如下两个接口:
ServletContextListenter:是对整个上下文环境的监控
ServletContextAttributeListener:对属性的监听
第一种接口;ServletContextListenter(对整个上下文环境的监控)
对Servlet上下文状态监听可以使用javax.servlet.ServletContextListener 接口,此接口定的方法如下表:(查找API文档 在javax.servlet中有个ServletContextListener。)
我们可以看到在两个方法中都有一个ServletContextEvent sce, 这是个事件 打开这个事件可以找到这样的一个方法。
在上下文状态的监听操作中,一旦触发了ServletContextListener接口中定义的事件后,可以通过ServletContextEvent进行事件的处理
package listener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class ServletContextListenerDemo implements ServletContextListener{ public void contextInitialized(ServletContextEvent event){//对上下文初始化触发 System.out.println("**容器初始化-->"+event.getServletContext().getContextPath()); } public void contextDestroyed(ServletContextEvent event){//上下文销毁时触发 System.out.println("**容器销毁-->"+event.getServletContext().getContextPath()); } }zai
在完成之后,老规矩,配置web.xml。
简单Servlet需要:<servelt><servlet-mapping>
过滤器需要:<filter><filter-mapping>
但是现在的监听器就省事多了,直接编写<listener>即可
<listener> <listener-class> listener.ServletContextListenerDemo </listener-class> </listener>
启动服务器,如下图所示,出现了初始化,当关闭服务器的时候就执行销毁了。
只要是容器的启动和关闭都呀执行这些操作,但是这样有什么用处,我们待会再说吧
第二种接口:ServletContextAttributeListener(对属性的监听)
此接口可以直接对属性监听
看一下这个接口的方法: 在API中javax.servlet中的ServletContextAttributeList
在上下文属性监听中,一旦触发了ServletContextAttributeListener接口中定义的事件后,可以通过ServletContextAttributeEvent进行事件的处理,事件定义方法如下:
package listener; import javax.servlet.*; public class ServletContextAttributeListenerDemo implements ServletContextAttributeListener { public void attributeAdded(ServletContextAttributeEvent event){//属性增加时触发 System.out.println("**增加属性->:"+event.getName()+",属性内容:"+event.getValue()); } public void attributeRemoved(ServletContextAttributeEvent event){//属性删除的时触发 System.out.println("**删除属性->属性名称:"+event.getName()+",属性内容:"+event.getValue()); } public void attributeReplaced(ServletContextAttributeEvent event){//属性替换时触发 System.out.println("**增加替换->属性名称:"+event.getName()+",属性内容:"+event.getValue()); } }
配置web.xml文件如下
<listener> <listener-class> listener.ServletContextAttributeListenerDemo </listener-class> </listener>
这个时候启动服务器是没有效果显示的
这个时候为了看出我们设置的application,可以写一个JSP页面
application_attribute_add.jsp <%@ page language="java" contentType="text/html" pageEncoding="utf-8"%> <html> <head> <title>WEB开发项目</title> </head> <body> <% //设置application范围属性 this.getServletContext().setAttribute("info","http://zhaoyuqiang.blog.51cto.com"); %> </body> </html>
启动服务器,然后在浏览器中输入:http://localhost:8080/test/jsp/application_attribute_add.jsp
页面什么都东西都没有 但是看我们的服务器,如下图所示:
当我们刷新浏览器的时候,服务器显示替换属性了,重复刷新就重复替换,如下图所示
那什么时候可以删除呢?为了观察方便,我们再来新建一个JSP页面
application_attribute_remove.jsp <%@ page language="java" contentType="text/html" pageEncoding="utf-8"%> <html> <head> <title>WEB开发项目</title> </head> <body> <% //设置application范围属性 this.getServletContext().removeAttribute("info"); %> </body> </html>
在浏览器中输入:http://localhost:8080/test/jsp/application_attribute_remove.jsp 观察服务器效果如下
监听器就是实现接口,覆写方法
以上都是对application实现操作的监听,session对象额监听我们下一篇文章再进行学习吧!