前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >javaWeb核心技术第十一篇之Listener

javaWeb核心技术第十一篇之Listener

作者头像
海仔
发布2019-08-26 18:20:24
3800
发布2019-08-26 18:20:24
举报
文章被收录于专栏:海仔技术驿站海仔技术驿站
代码语言:javascript
复制
监听器:所谓的监听器是指对整个WEB环境的监听,当被监视的对象发生改变时,立即调用相应的方法进行处理.
	监听术语:
		事件源:被监听的对象.
		监听器对象:监听事件源的对象
		注册或绑定:1和2结合的过程
		事件:事件源的行为动作(就是事件源的创建或者属性行为)
		事件对象:通过监听器可以获得事件源的对象

	监听域对象创建和销毁(三个):
		Requset 		Session 		ServletContext
类型:ServletRequest	 HttpSession        ServletContext
		
	ServletContext(重要):
	
	配置:
		1:创建类实现ServletContextListener接口.
		2.配置web.xml.
	
	ServletContextListener:监听ServletContext创建和销毁.
	创建:服务器启动创建;
	销毁:服务器关闭销毁.

web中三大组件,都需要实现接口,并且配置web.xmlns
	<!-- 监听器配置  listener-class类的全限定类名 -->
  <listener>
  	<listener-class></listener-class>
  </listener>
  
 作用:
	1.在创建方法的内部初始化参数(服务器的初始化参数,比如权限,比如,web环境的静态配置,比如后退进程)
	2.服务器关闭调用对应的销毁方法,就可以用来释放资源.( 例如对于一些客户端钱的问题,就需要释放资源进行回传到服务器.)
	
	Session的创建销毁:
		监听器:HttpSessionListener
		创建:第一次调用getSession()
		销毁:
			1:默认超时30分钟自动销毁.
			2.手动调用invalide().
			3.服务器非正常关闭.
	Request的创建销毁:
		监听器:ServletRequestListener
		创建:请求开始创建
		销毁:响应结束销毁

例如:		
public class MyServletRequestListener implements ServletRequestListener {
	public void requestDestroyed(ServletRequestEvent sre) {
		System.out.println("request  销毁");
	}
	public void requestInitialized(ServletRequestEvent sre) {
		System.out.println("request 创建");
	}
}
<listener>
	<listener-class>全限定类名</listener-class>
</listener>
	
在这里面的五个监听术语:
	1.事件源:服务器tomcat创建request对象.(request)
	2.监听器:(MyServletRequestListener)
	3.注册绑定:<listener-class>全限定类名</listener-class>
	4.事件:(request的创建和销毁)
	5.事件对象:(创建request的方法参数的变量:sre.getSource():参数调用方法使监听器获得事件源)
	
监听域对象属性操作(增删改)(三个)
			Request						Session  		  				ServletContext		
类型:ServletRequestAttributeListener	HttpSessionAttributeListener	ServletContextAttributeListener

统一api:
	setAttribute(name,value);
	getAttribute(name);(在监听域对象属性操作中没有查询,这个只是在api里面有)
	removeAttribute(name);

	ServletContextAttributeListener
	监听:域对象属性,添加,移除,替换操作,会执行对应的方法.
	
	ServletRequestAttributeListener
	监听:域对象属性,添加,移除,替换操作,会执行对应的方法.
	
	HttpSessionAttributeListener.
	监听:域对象属性,添加,移除,替换操作,会执行对应的方法.
	监听往域中放数据,数据没有任何要求.
	
	以上六个监听器都必须在web.xml中配置.
	特殊javaBean监听不需要配置web.xml,但配置了也可以.
		
监听特殊javaBean(两个)
	特殊javaBean 指的是javaBean对象(类),必须实现特殊的接口User ,Category,Product
		HttpSessionBindingListener:监听javaBean在session中绑定和解绑的.
		HttpSessionAttributeListener:监听数据在session中操作.
	
	区别:
		HttpSessionAttributeListener : 监听的数据没有要求.
		HttpSessionBindingListener: 只监听特殊javaBean.
	
	开发中经典案例:在登陆功能中统计登陆成功的人数,但没有源码,
	登陆成功需要将user数据放入session,只需要统计session绑定了几个user对象
	
	HttpSessionActivactionListener : 监听javaBean 活化和钝化,发生时机在服务器关闭和服务器启动(为什么发生在这里呢?因为session)
		活化:反序列化,将磁盘中内容读取到内存中.
		钝化:序列化,将内存中数据写到磁盘中.
		要求:特殊javaBean必须实现Serializable接口
		
	2.5邮件
		邮件服务器 : 发送邮件服务器 和 接收邮件服务器
		发送邮件服务器:
			协议:smtp  端口25
		接收邮件服务器 
			协议POP3 端口110
			
	Web中一共有13套规范 tomcat支持2套 Servlet Jsp
	Mail 需要导入jar 今日邮件要求 使用工具类

		要点:
		1.搭建本地的邮件服务器
		2.使用工具类发送邮件	
		
	Js:
		setTimeout( 函数名称 , 毫秒值) 执行一次
		setInterval(函数名称 , 毫秒值) 周期执行
	java定时器:	Timer
	
	 * 参数1 : 被执行的任务 TimerTask
		 * 参数2 : 延迟执行的时间 (毫秒)
		 * 参数3 : 周期执行的时间(毫秒)
		 * 真实开发中案例:QQ每年都要发送生日邮件
		 * 参数2 : 一般都是凌晨 00:00  切日 跑批任务   获得一天的毫秒值 - 当前已经过去的毫秒值
		 * 参数3 : 设置一天的毫秒值   
		 */
		System.out.println(new Date().toLocaleString());
		new Timer().schedule(new TimerTask() {
			@Override
			public void run() {
				System.out.println(new Date().toLocaleString());
			}
		}, DateUtils.getDelayTime(), DateUtils.getOneDay());
		
		2.7案例
			1.创建监听器
			2.在监听器的监听创建方法中 初始化定时器
			3.定时器 : 
			a)从数据库中获得当天过生日的人 返回值List<User>
			b)Dao层 拼接字符串 需要注意  
			c)遍历 发送邮件
			
案例:

public class MyServletContextListener implements ServletContextListener {

    public void contextInitialized(ServletContextEvent arg0)  { 
    	//2.初始化定时器
    	new Timer().schedule(new TimerTask() {
			
			@Override
			public void run() {
				try {
					//3.调用service  获得当天过生日的人
					UserService service = new UserService();
					List<User> list = service.findBirthday();
					//4.遍历集合发送邮件
					for(User user : list) {
						EmailUtils.send(user.getEmail(),"<a href='https://www.baidu.com/'>"+ user.getUsername() +  "生日快乐" + "</a");
						System.out.println(user.getUsername() + ": OK");
					}
				}catch(Exception e) {
					e.printStackTrace();
				}
				
			}
		}, 2000, 4000);
    }
    public void contextDestroyed(ServletContextEvent arg0)  { 
    }
	
}

public class UserDao {

	public List<User> findBirthday() throws Exception {
		//t_user
		//日期格式  -月 -日
		String birthday = "-" + DateUtils.getCurrentMonth() + "-" + DateUtils.getCurrentDay();
		
		QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
		String sql = " select * from t_user where birthday like ? ";
		Object[] params = { "%" + birthday + "%"};
		List<User> list = qr.query(sql, new BeanListHandler<User>(User.class), params);
		return list;
	}

}

<%--要想在函数的参数传入字符串,必须加单引号 --%>
	<a href="javascript:void(0)" onclick="change('${product.pid}')">
		g src="${pageContext.request.contextPath}/images/i_del.gif" width="16" height="16" border="0" style="CURSOR: hand">
	</a>		

UUID.randomUUID().toString().replace("-", ""): 随机生成一个不重复的字符串,进行替换,变成一个由字母和数字组成的字符串.

随机生成ID  UUID.randomUUID
超链接 <a href=”javascript:void(0)” onclick=”函数(单引号 + 字符串)”>
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年08月24日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档