Listener监听器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZJ_2420441444/article/details/79967799

1,什么是监听器

监听器用于监听web应用中某些对象(application,session,request)、信息的创建、销毁、增加,修改,删除等动作的发生,然后作出相应的响应处理。当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法。

2,监听器的用途

  • 1、统计在线人数和在线用户
  • 2、系统加载时进行信息的初始化工作
  • 3、统计网站的访问量
  • 4、跟Spring结合
3,监听器的分类

第一维度:按照被监听的对象划分:ServletRequest域,HttpSession域,ServletContext域

第二维度:监听的内容分:监听域对象的创建与销毁的监听域对象的属性变化的


4,监听器的编写步骤(重点)

    a、编写一个监听器类去实现监听器接口

    b、覆盖监听器的方法

    c、 需要在web.xml中进行配置---注册

5,监听三大域对象的创建与销毁的监听器

(1)监听ServletContext域的创建与销毁的监听器ServletContextListener(重点)

   1)Servlet域的生命周期

        何时创建:服务器启动创建

        何时销毁:服务器关闭销毁

   2)ServletContextListener监听器的主要作用

      a、初始化的工作:初始化对象 初始化数据 ---- 加载数据库驱动  连接池的初始 化

      b、加载一些初始化的配置文件 --- spring的配置文件

      c、任务调度----定时器----Timer/TimerTask

   3)重写的方法

     public void contextInitialized(ServletContextEvent sce);//上下文初始化
     public void contextDestroyed(ServletContextEvent sce);//上下文销毁

     //ServletContextEvent事件:取得一个ServletContext(application)对象
c案例
@Override
	public void contextInitialized(ServletContextEvent arg0) {
		System.out.println("创建");
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		Date parse = null;
		try {
			parse = sdf.parse("2018-04-16 00:00:00");
		} catch (ParseException e) {
			e.printStackTrace();
		}
		Timer timer = new Timer();
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				System.out.println("银行开始计息了。。。");
			}
		}, parse, 24*60*60*1000);

	}

(2)监听Httpsession域的创建于销毁的监听器HttpSessionListener

1)HttpSession对象的生命周期

      何时创建:第一次调用request.getSession时创建

      何时销毁:服务器关闭销毁  session过期(web.xml)  手动销毁(session.invalidate();

2)里面重写的方法

@Override
	public void sessionCreated(HttpSessionEvent arg0) {
		
	}

	@Override
	public void sessionDestroyed(HttpSessionEvent arg0) {
		
	}

2)利用HttpSessionListener统计最多在线用户人数

	private int counts = 0;// 用于统计在线人数

	@Override
	public void sessionCreated(HttpSessionEvent arg0) {
		counts++;
		arg0.getSession().getServletContext().setAttribute("name", counts); // 用户人数+1
	}

	@Override
	public void sessionDestroyed(HttpSessionEvent arg0) {
		counts--;
		arg0.getSession().getServletContext().setAttribute("Count", counts);
	}

(3)监听ServletRequest域创建与销毁的监听器ServletRequestListener

1)ServletRequest的生命周期

    创建:每一次请求都会创建request

    销毁:请求结束

2)ServletRequestListener的方法

@Override
	public void requestDestroyed(ServletRequestEvent arg0) {
		
	}

	@Override
	public void requestInitialized(ServletRequestEvent arg0) {
		
	}
6,监听三大域对象的属性变化的

(1)域对象的通用的方法:

 setAttribute(name,value)

        --- 触发添加属性的监听器的方法   

        --- 触发修改属性的监听器的方法

getAttribute(name)

removeAttribute(name)  --- 触发删除属性的监听器的方法 

(2)ServletContextAttibuteListener监听器

@Override
	public void attributeAdded(ServletContextAttributeEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void attributeRemoved(ServletContextAttributeEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void attributeReplaced(ServletContextAttributeEvent arg0) {
		// TODO Auto-generated method stub
		
	}
其他的域对象属性类似

参考文章  http://www.cnblogs.com/coderland/p/5902874.html









   







紧急求助,Listener监听器问题

05-08

在作一个项目的时候,由于系统需要在后台定时的自动的向远程服务器请求数据来同步本地数据库,项目采用的技术主要是hibernate,因此在作的时候采用了HttpSessionListener监听器,并使用Timer作为定时执行,远程请求方法也使用了同步,但是现在遇到一个问题,如果Timer的参数通过配置文件改变后,怎样可以在避免重启服务器的情况下使Timer使用新的参数来运行?rn程序代码:rnrn//监听器rnpublic class BankUpdateListener extends DbBase implements HttpSessionListener rnrn LogUtil log= LogFactory.getLogUtil(BankUpdateListener.class);rnrnrn public void sessionCreated(HttpSessionEvent httpSessionEvent) rn BankTimer.start();rn rnrn public void sessionDestroyed(HttpSessionEvent httpSessionEvent) rn //To change body of implemented methods use File | Settings | File Templates.rn rnrnrnrnrn//定时器rnpublic class BankTimer extends DbBase rnrn static LogUtil log = LogFactory.getLogUtil(BankTimer.class);rnrn private static final String CONFIG_URL="/bank/bank-config.properties";rnrn private static PropUtil pu;rnrn private static Timer timer=null;//定时器rnrn private static int deplay;//延迟时间rnrn private static int internal;//执行时间间隔rnrn private static String curDate;//当前日期rnrn public BankTimer() rnrn rnrn /**rn * 时间定时器rn */rn private static TimerTask task = new TimerTask() rn synchronized public void run() rn System.out.println("定时器启动!"+System.currentTimeMillis());rn rn ;rnrn /**rn * 无延迟定时器启动rn *rn * @param internalrn */rn public static void start(int internal) rn timer.schedule(task, 0, internal);rn rnrn /**rn * 延迟一定时候后定时器启动rn *rn * @param delayrn * @param internalrn */rn public static void start(int delay, int internal) rn timer.schedule(task, delay, internal);rn rnrn /**rn * 定时器启动rn */rn public static void start() rn init();rn timer.schedule(task, deplay, internal);rn rnrn /**rn * 定时器停止rn */rn public static void stop()rn timer.cancel();rn rnrn private static void init() rn timer = new Timer();rn Date now=new Date();rn DateFormat df=DateFormat.getDateInstance(DateFormat.DEFAULT);rn curDate=df.format(now);rn try rn pu = PropUtil.getInstance(CONFIG_URL);rn internal=Integer.parseInt(pu.getProperty("internal"));rn deplay=Integer.parseInt(pu.getProperty("deplay"));rn catch (Exception e) rn deplay = 5000;//延迟5秒后执行rn internal = 2000;//默认间隔时间为30分钟rn log.error(e.getMessage());rn rn rnrnrnrnrn

oracle10g在linux下的 监听器(listener)问题 高分

07-06

emctl start console已经可以启动rndbstart也没有问题rnrnlsnrctl start 会出现一下结果rnrnLSNRCTL for Linux: Version 10.2.0.1.0 - Production on 06-JUL-2007 15:37:43rnrnCopyright (c) 1991, 2005, Oracle. All rights reserved.rnrnStarting /u01/app/oracle/product/10.2.0/db_1/bin/tnslsnr: please wait...rnrnTNSLSNR for Linux: Version 10.2.0.1.0 - ProductionrnSystem parameter file is /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.orarnLog messages written to /u01/app/oracle/product/10.2.0/db_1/network/log/listener.logrnListening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=db.localdomain)(PORT=1521)))rnrnConnecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))rnTNS-12547: TNS:lost contactrn TNS-12560: TNS:protocol adapter errorrn TNS-00517: Lost contactrn Linux Error: 104: Connection reset by peerrnrn我已经尝试过的方法:rn修改listener.ora和tnsnames.ora里面的很多参数也不行里的host主机名改为ip。rnrn其余的症状:rn1。运行netca时候用界面配置的时候会显示rnListener Control complete.rnListener start failed. Listener may already be running.rnrn2。我把监听器删了,然后全部重新设置,包括端口都改为 1531了。rn但是运行时,仍然显示:rnListening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=db.localdomain)(PORT=1521)))rnrnConnecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))rn我发现这个port仍然是1521。rnrn不知道具体是什么原因。。rn现想请教大家有什么办法呢?谢谢各位了rnrnrn

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试