博主:这几天一直在搭自己的博客,哎,各种问题,比如头像无法显示,各种乱七八糟的配置文件啊什么的,搞得人脑壳疼。最终,博主还是放弃了,就用CSDN吧,广告多就多吧,毕竟博主也不是什么大佬,今天就给大家说说JavaWeb中的监听器,之前一直没有写专业方面的东西的习惯,所以导致前面很多东西都忘了,所以,以此记录之后的学习吧,谢谢
一:监听器简介
1:想必大家多少都有了解过JavaGui中的事件监听器吧,就如一个Button的事件监听,顺便回顾一个GUI事件编
程的三要素(JavaGUI现在基本没人用了,不过这次,博主的课程设计就是用JavaGUI写的,现在还在写,JavaGUI
的布局是真的TMD烦,):
GUI事件编程的三要素:
事件源:JButton / Button 、 JFrame/Frame 组件
事件:KeyEvent 、 WindowEvent 、 MouseEvent
监听器:KeyListener 、WindowListener、MouseListener
2:那么在web开发中也有类似的这样的编程要素,那我们就来看看web开发事件编程三要素:
事件源: ServletContext 、ServletRequest、HttpSession事件:
对象创建或销毁:ServletContextEvent、ServletRequestEvent、 HttpSessionEvent
操作属性:ServletContextAttributeEvent、ServletRequestAttributeEvent、 HttpSessionBindingEvent
事件监听器:ServletContextListener 、 ServletRequestListener......
3:在我们web开发中我们会经常频繁的使用到这三个对象,ServletContext,ServletRequest,HttpSession。
当我们需要做一些特定的操作,比如:当你启动你的tomcat(博主这里是tomcat)加载你的web应用时,在加载过
程中同时需要它去初始化一些东西,这我们该怎么操作呢,比如当你的web应用一加载,我们就让程序去在我们的
数据库中创建一张信息表,这该怎么操作呢?别急,且听博主慢慢说来。
这个时候呢,我们可以联想到Web应用中的Context对象,首先一个Web应用只对应一个Context对象,并且
在加载这个Web应用的时候也自动的随之去加载这个Context对象,那如果我们能够监听Context对象的创建,并且
在它创建的时候去触发一些操作,比如就像前面所说的去创建表,那岂不是美滋滋。想听,就继续看。
4:接下来我们就先看看在Web应用中的这些监听器到底有哪些?
web事件源
web事件对象
web事件监听器
ServletContext对象
ServletContextEvent
创建或销毁对象时触发
ServletContextListener
ServletContext属性
ServletContextAttributeEvent
属性操作(增加属性,修改属性,删除属性)
ServletContextAttributeListener
ServletRequest对象
ServletRequestEvent
创建或销毁对象时触发
ServletRequestListener
ServletRequest属性
ServletRequestAttributeEvent
属性操作(增加属性,修改属性,删除属性)
ServletRequestAttributeListener
HttpSession对象
HttpSessionEvent
创建或销毁对象时触发
HttpSessionListener
HttpSession属性
HttpSessionBindingEvent
属性操作(增加属性,修改属性,删除属性)
HttpSessionAttributeLisene
怎么样?博主这波整理的够清除吧,一目了然,那接下来我们就看看这些监听器到底该如何使用呢?
二:ServletContext对象监听
1:ServletContextListener:
这个类呢它主要是监听 ServletContext对象的创建和销毁 。那么ServletContext是什么时候创建又是什么
时候销毁的呢?这个博主之前就说过,当你启动服务器加载这个Web应用时这个对象就创建ServletContext对象,
反之当服务器关闭或者Web应用重新加载的时候它则会销毁。
创建:Web应用加载
销毁:Web应用重新加载或Web服务停止
那么我们到底该如何监听它呢?
步骤:
1:创建java类,实现ServletContextListener接口,实现其中的方法;
2:监听器要交给tomcat服务器运行。
所以:需要在web.xml文件中进行配置(配置如下)
<!-- 注册监听器 --> <listener> <!-- 监听器程序全名 --> <listener-class>gz.itcast.a_context.MyContextListener</listener-class> </listener>
2:ServletContextAttributeListener:
看这个对象名,是不是其中有个Attribute,那这个英文翻译过来是不是属性的意思,对没错,这个类就
是监听ServletContext对象的属性操作(增加,删除,修改)
增加属性: setAttribute(name,Object); 第一次就是增加属性
修改属性: setAttribute(name,Object); 如果前面有增加了同名的属性,则修改。
删除属性: removeAttribute(name);
接下来请看一段代码:
/** * ServletContext对象 * 应用: 项目需要初始化工作和清理工作 * 需求: 在项目启动时,创建学生表;项目停止时,把学生表删除。 * */ public class MyContextListener implements ServletContextListener,ServletContextAttributeListener{ StudentDao stuDao = new StudentDao(); /** * 用于监听ServletContext对象的创建。ServletContext对象创建时调用次方法 */ public void contextInitialized(ServletContextEvent sce) { System.out.println("ServletContext对象创建了"); //创建学生表 stuDao.initTable(); System.out.println("表创建成功!"); } /** * 用于监听ServletContext对象的销毁。ServletContext对象销毁时调用次方法 */ public void contextDestroyed(ServletContextEvent sce) { System.out.println("ServletContext对象销毁了"); //删除学生表 stuDao.dropTable(); System.out.println("表删除成功!"); } /******************属性相关的**********************/ /** * 属性添加 */ public void attributeAdded(ServletContextAttributeEvent scab) { //1.得到属性名称 String name = scab.getName(); //2.得到属性值 Object value = scab.getValue(); System.out.println("属性添加:"+name+"="+value); } /** * 属性修改 */ public void attributeReplaced(ServletContextAttributeEvent scab) { //1.得到属性名称 String name = scab.getName(); //2.得到修改前的属性值 //Object value = scab.getValue(); //2.得到修改后的属性值 ServletContext context = scab.getServletContext(); Object value = context.getAttribute(name); System.out.println("属性修改:"+name+"="+value); } /** * 属性删除 */ public void attributeRemoved(ServletContextAttributeEvent scab) { //1.得到属性名称 String name = scab.getName(); //2.得到属性值 Object value = scab.getValue(); System.out.println("属性删除:"+name+"="+value); } }
怎么样啊,现在我们是不是会用了,只需实现两个接口,便可对它进行监听
二:ServletRequestListener对象监听
1:ServletRequestListener:
用于监听ServletRequest对象的创建和销毁。
request对象什么时候创建呢?这个想必大家都知道,我也不多说,直接贴
ServletRequest对象:封装请求信息
创建:每次发出请求时
销毁:请求完毕后
2:ServletRequestAttributeListener:
ServletRequestAttributeListener用于监听ServletRequest属性操作(这些不用我再多说了)
/** * ServletRequest对象 * 应用: 得到请求相关信息 */ public class MyRequestListener implements ServletRequestListener,ServletRequestAttributeListener{ /** * 用于监听ServletRequest对象的创建。ServletRequest对象创建时调用次方法 */ public void requestInitialized(ServletRequestEvent sre) { System.out.println("request对象创建了"+sre.getServletRequest()); //得到客户的IP地址 HttpServletRequest request = (HttpServletRequest)sre.getServletRequest(); String ip = request.getRemoteHost(); //把ip地址放入到session域中 HttpSession session = request.getSession(); session.setAttribute("ip", ip); } /** * /** * 用于监听ServletRequest对象的销毁。ServletRequest对象销毁时调用次方法 */ public void requestDestroyed(ServletRequestEvent sre) { System.out.println("request对象销毁了"+sre.getServletRequest()); } /************属性相关的*****************/ /** * 属性添加 */ public void attributeAdded(ServletRequestAttributeEvent srae) { String name = srae.getName(); Object value = srae.getValue(); System.out.println("属性增加: "+name+"="+value); } /** * 属性修改 */ public void attributeReplaced(ServletRequestAttributeEvent srae) { String name = srae.getName(); //修改后的值 ServletRequest request = srae.getServletRequest(); Object value = request.getAttribute(name); System.out.println("属性修改: "+name+"="+value); } /** * 属性删除 */ public void attributeRemoved(ServletRequestAttributeEvent srae) { String name = srae.getName(); Object value = srae.getValue(); System.out.println("属性删除: "+name+"="+value); } }
二:HttpSession对象监听:
(博主现在好困啊,12:08了)
1:HttpSessionListener:
用于监听HttpSession对象的创建和销毁
HttpSession对象:
创建:调用request.getSession()方法
销毁:
1)默认情况下,30分钟服务器自动回收
2)设置有效时长: setMaxActiveInterval(秒);
3)web.xml配置全局的过期时间
<session-config> <session-timeout>分钟</session-timeout> </session-config>
4)手动销毁: invalidate()方法
接下来大家看一个案列,博主在这里直接贴代码了,因为很简单,只要你将前面的都看过了,那这个肯定没问题
案例:粗略统计在线访客人数
/** * HttpSession对象 * */ public class MySessionListener implements HttpSessionListener,HttpSessionAttributeListener{ int count = 0; /** * 监听HttpSession对象的创建。 */ public void sessionCreated(HttpSessionEvent se) { System.out.println("session对象创建了"+se.getSession()); /** * 使用代码锁避免线程并发问题 */ synchronized (MySessionListener.class) { /** * 访客人数+1 */ count++; System.out.println("当前访客人数:"+count); //保存到context域中 ServletContext context = se.getSession().getServletContext(); context.setAttribute("visit", count); } } /** * 监听HttpSession对象的销毁 */ public void sessionDestroyed(HttpSessionEvent se) { System.out.println("session对象销毁了"+se.getSession()); synchronized (MySessionListener.class) { /** * 访客人数-1 */ count--; //保存到context域中 ServletContext context = se.getSession().getServletContext(); context.setAttribute("visit", count); } } /**************属性相关的******************/ /** * 属性添加 */ public void attributeAdded(HttpSessionBindingEvent se) { String name = se.getName(); Object value = se.getValue(); System.out.println("属性增加: "+name+"="+value); } /** * 属性修改 */ public void attributeReplaced(HttpSessionBindingEvent se) { String name = se.getName(); //得到修改后的值 HttpSession session = se.getSession(); Object value = session.getAttribute(name); System.out.println("属性修改: "+name+"="+value); } /** * 属性删除 */ public void attributeRemoved(HttpSessionBindingEvent se) { String name = se.getName(); Object value = se.getValue(); System.out.println("属性删除: "+name+"="+value); } }
2:HttpSessionAttributeLisener:
HttpSessionAttributeLisener用于监听HttpSession的属性操作
增加属性: setAttribute(name,Object); 第一次就是增加属性
修改属性: setAttribute(name,Object); 如果前面有增加了同名的属性,则修改。
删除属性: removeAttribute(name);
案例:显示当前网站的登录用户信息
需求:
1)提供用户登录的功能,提供注销功能。
2)显示当前网站的所有登录用户信息
3)管理员可以踢除指定的登录用户。
各位可以自己做一下,在看看博主做的GitHub(自己去找有备注的)
JavaWeb----监听器
最新推荐文章于 2024-09-05 07:24:18 发布