欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

17.12.11,web学习第二十三天,还有一年,努力吧青年Listener

程序员文章站 2022-06-20 16:18:42
...

Listener

1. 事件源:被监听的对象-3个域对象request session servletContext.

监听器:监听对象。6+2

注册监听器:

响应行为:

2. 监听器有哪些?

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

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

3. 监听ServletContext创建与销毁的ServletContextListener(重要)

规范在java中一般都是接口。

ServletContextListenerservletContext具有相同的生命周期。

监听器编写的步骤:

1)编写一个监听类去实现监听类接口。

Implements ServletContextListerer{}

2)覆盖监听器的方法。

contextInitialized(ServletContextEvent sc)

ContextDestroy(ServletContextEvent sce)

通过ServletContextEvent可以获得被监听的对象。

3)需要在web.xml中进行配置。-注册

<listener>

<listener-class>demo23.myServletContextListener</listener-class>

 </listener>

ServletContextListener监听器作用:EE开发过程中,能不用静态代码块就不用静态代码块来初始化。原理:服务器启动便启动监听器便可以完成初始化操作。

A)初始化工作:初始化对象,初始化数据--加载数据库驱动,连接池的初始化。

B)加载一些初始化的配置文件--Spring的配置文件.

C ) 任务调度---定时器  Timer/TimerTask(最有用)

模拟银行定时干某事:
@Override
public void contextInitialized(ServletContextEvent sce) {
SimpleDateFormat sdf = new SimpleDateFormat("yy-MM-dd hh:mm:ss");
Date date = null;
try {
date = sdf.parse("2017-12-11 20:49:00");
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Timer t = new Timer();
t.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println("123");
}
}, date, 5000);
}

4. HttpSession域的监听器HttpSessionListener

httpSession对象的生命周期:

第一次request.getSession()时创建。

服务器关闭销毁,session到期,手动销毁。

当访问Jsp时,jsp默认便初始化了session所以这个监听器成立!

作用:可以访问网站计数!

5. ServletRequest域创建与销毁的监听器ServletRequestListener

没什么鸟用。

6. 监听三大域对象属性变化的:(不重要)

ServletContextAttributeListener监听器

添加属性监听,修改属性监听,删除属性监听。

HttpSessionAttributeListener同上

ServletRequestAttributeListener同上

7. 与session中的绑定的对象相关的监听HttpSessionBindingListenter (对象感知监听器)

即将绑定到session对象有几种状态:

绑定状态,解绑状态。

class JB implements HttpSessionBindingListener(){

//重写俩方法

}

钝化状态:将session中的对象序列化到磁盘。服务器正常关闭时 钝化。

Class JB implements HttpSessionActivationListener,Serializable{}

 

活化状态:就是将磁盘上的对象再次恢复到session中。服务器再 次启动时或活。

可以使用配置文件指定钝化时间,在META-INF下创建content.xml

<Context>

 <!-- maxIdleSwap:session中的对象多长时间不使用就钝化 -->

 <!-- directory:钝化后的对象的文件写到磁盘的哪个目录下  配置钝化的对象文件在  -->

 <Manager className="org.apache.catalina.session.PersistentManager"  maxIdleSwap="1">//按分钟

  <Store className="org.apache.catalina.session.FileStore" directory="itcast205" />

 </Manager>

</Context>

被钝化到哪里:work/catalina/localhost/钝化文件

8. 邮箱服务器:

基本概念:

邮箱客户端既可以在网页上也可以是案装形式。

邮箱服务器:起到邮箱的接收和推送的作用。

邮箱发送的协议:约束。

接收:POP3  IMAP

发送: SMTP

发邮件时客户端发给SMTPSMTP只能找SMTP,客户端接收邮 件时,向POP3要邮件,POP3从和SMTP的公共区域拿邮件发回。

Eyou邮箱服务器卸载不干净,我安装在了c:盘记得清理

10.web工程里可以创建含有main方法的java文件,右键点java Application可以运行。

9. 写程序发邮件:(内网)

mail.jar导包+MailUtils.java文件

10. 案例:发送生日祝福:(内网)

安装服务器和注册2个域名:

[email protected]就是域名

Listener.java:(MailUtils.java和JB未写)
package Listener;
public class listnen implements ServletContextListener {

	@Override
	public void contextInitialized(ServletContextEvent sce) {
		Timer t = new Timer();
		Date d = new Date();
		SimpleDateFormat sdf = new SimpleDateFormat("MM-dd");
		String dd = sdf.format(d);
		System.out.println(dd);
		t.scheduleAtFixedRate(new TimerTask() {

			@Override
			public void run() {
				ComboPooledDataSource cpds = new ComboPooledDataSource();
				QueryRunner qr = new QueryRunner(cpds);
				try {
					List<JB> l = qr.query("select * from user where birthday like ?", new BeanListHandler<JB>(JB.class),
							"%" + dd);
					if (l != null) {
						for (JB jb : l) {
							try {
								MailUtils.sendMail(jb.getEmail(), "祝你生日快乐!");
								System.out.println("发送一条短信");
							} catch (MessagingException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
						}
					}
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}, new Date(), 1000 * 10);
	}
	@Override
	public void contextDestroyed(ServletContextEvent sce) {
	}
}
17.12.11,web学习第二十三天,还有一年,努力吧青年Listener