JavaWeb----监听器

博主:这几天一直在搭自己的博客,哎,各种问题,比如头像无法显示,各种乱七八糟的配置文件啊什么的,搞得人脑壳疼。最终,博主还是放弃了,就用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(自己去找有备注的)


                



 
















猜你喜欢

转载自blog.csdn.net/qq_40915081/article/details/80637621