17.12.11,web学习第二十三天,还有一年,努力吧青年Listener
Listener
1. 事件源:被监听的对象-3个域对象request session servletContext.
监听器:监听对象。6+2
注册监听器:
响应行为:
2. 监听器有哪些?
第一维度:按照被监听的对象划分:ServletRequest域, HttpSession域,ServletContext域。
第二维度:监听内容分:监听域对象创建与销毁的,监听域对象 属性变化的。
3. 监听ServletContext创建与销毁的ServletContextListener(重要)
规范在java中一般都是接口。
ServletContextListener和servletContext具有相同的生命周期。
监听器编写的步骤:
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
发邮件时客户端发给SMTP,SMTP只能找SMTP,客户端接收邮 件时,向POP3要邮件,POP3从和SMTP的公共区域拿邮件发回。
Eyou邮箱服务器卸载不干净,我安装在了c:盘记得清理
10.在web工程里可以创建含有main方法的java文件,右键点java Application可以运行。
9. 写程序发邮件:(内网)
mail.jar导包+MailUtils.java文件
10. 案例:发送生日祝福:(内网)
安装服务器和注册2个域名:
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) {
}
}