1 WEB监听器

1.1 概述

Web监听器就是一个组件,可以对其他的内容,进行监视控制,当被监视的内容,发生指定的行为时,web监听器就可以给出相应的处理方案。
事件源:被监视的内容。
监听器:监视别人的东西,称为监听器。
事件:作用于事件源上的行为。
事件源对事件行为描述出来的一个对象,就是事件对象(事件对象可以包含事件源)。

1.2 Web中的事件源

一共有3个事件源:
(1)HttpServletRequest 请求对象
(2)HttpSession session
(3)ServletContext 工程对象

1.3 Web中的监听器

Web中一共提供了8个监听器,分别监听上述的3个事件源。
8个监听器分为3类:
第1类:监视事件源的创建与销毁。(事件源的生命周期)
HttpServletRequestListener
HttpSessionListener
ServletContextListener
第2类:监视事件源的属性值变化。(属性值的增删改查)
HttpServletRequestAttributeListener
HttpSessionAttributeListener
ServletContextAttributeListener
第3类:监视session对象与javaBean的关系的两个监听器。
绑定与解绑定:
HTTPSessionBinDingListener
活化与钝化:
HttpSessionActivationListener

1.4 监听器的创建步骤

1:编写一个类,实现相应的接口。(实现8个监听器之一)
2:在web.xml中配置监听器。(前两类需要配,第3类不需要配)

1.5 监听器方法中的形式参数—事件对象

通过事件对象可以获取事件源对象,也可以获取与事件触发时的相关信息。
例如:
session属性变化的监听器,就可以获取session对象和session对象中发生变化的属性名和属性值。
相关API:

[String](http://java.sun.com/j2se/1.5/docs/api/java/lang/String.html) **[getName]()**``() 获取发送变化的属性名
[HttpSession]() **[getSession]()**``() 获取发送变化的session对象
[Object](http://java.sun.com/j2se/1.5/docs/api/java/lang/Object.html) **[getValue]()**``() 获取发送变化的属性值

1.6 Web中特殊的监听器

与session相关的监听器中有两个特殊的监听器,特殊的监听器不需要在web.xml中进行配置。
特殊的监听器必须由javaBean来实现这两个接口中的其中之一。
实现接口的javaBean就会自动感知自己是否被session绑定或解绑定,活化或钝化。
名称解释:
绑定:
将javaBean对象保存到session对象中,就是绑定。
解绑定:
将javaBean对象从session中移除,就是解绑定。
活化:
从硬盘中将对象读取到内存中。
钝化:
从内存中将对象序列化到硬盘上。

2 定时器任务类Timer

2.1 Java中的定时器

java.util.Timer类:在java中也可以使用一个线程,单独的对某个任务进行延迟执行或周期性执行,这个定时器类就是Timer类。

2.2 Timer的使用

2.2.1 构造方法

直接使用空参数的构造方法即可:
Timer() 创建一个新计时器。

2.2.2 常用API

void **[schedule]()**``([TimerTask]() task, [Date]() time)
在指定的时间(time)执行指定的任务(task)。
void **[schedule]()**``([TimerTask]() task, [Date]() firstTime, long period)
在指定的时间(firstTime)开始,每间隔指定的时间(period)执行任务(task)
void **[schedule]()**``([TimerTask]() task, long delay)
从当前时间开始,延迟(delay)时间后执行指定的任务(task)。
void **[schedule]()**``([TimerTask]() task, long delay, long period)
从当前时间开始,延迟(delay)时间后,每间隔(period)``时间循环执行指定的任务(task)。

TimerTask 就是一个Runnable接口的一个实现类,但是是一个抽象类,如果我们想创建一个TimerTask 类型的对象,就必须继承TimerTask这个类,重写run方法(因为实现了Runnable接口所以肯定有run方法),会由Timer对象自动调用run方法。

3 电子邮件

3.1 电子邮件概述

所谓的电子邮件就是在邮件服务器上的一个账户和一片空间,使用这个账号可以进行邮件发送或邮件接收。
邮件服务器:实质上就是一台电脑,安装了一个邮件服务器的软件。

3.2 电子邮件的发送与读取流程

邮件发送的流程示意图.png

3.3 电子邮件的发送与接收协议介绍

发送协议:SMTP协议,用于多台邮件服务器之间进行邮件交互。
发邮件的端口号: 25

接收协议:POP3协议,用于账户与服务器之间邮件的查收。
收邮件的端口号: 110

3.4 易邮邮件服务器的安装与使用

1:安装步骤;(直接下一步)
2:会提示无法使用浏览器;忽略即可;
image.png
3:配置服务器;
image.png
4:账号添加;(注册)
image.png
5:安装客户端软件(FoxMail),配置账户
image.png
image.png
image.png

3.5 使用java代码发送电子邮件

使用mail.jar可以完成电子邮件的发送。
Java代码发送邮件的步骤:(了解)
1:创建一个session会话对象(邮件服务器上的session会话对象);
2:设置登录的账户和密码;(设置发件人)
3:编写邮件内容;(发给谁)
4:发送邮件;(工具类的静态方法)
读已经编写好的工具类:
mustang_MailUtils

  1. package
  2. import java.util.Properties;
  3. import javax.mail.Authenticator;
  4. import javax.mail.Message;
  5. import javax.mail.MessagingException;
  6. import javax.mail.PasswordAuthentication;
  7. import javax.mail.Session;
  8. import javax.mail.Transport;
  9. import javax.mail.internet.AddressException;
  10. import javax.mail.internet.InternetAddress;
  11. import javax.mail.internet.MimeMessage;
  12. import javax.mail.internet.MimeMessage.RecipientType;
  13. public class mustang_MailUtils {
  14. public static void sendMail(String email, String emailMsg)
  15. throws AddressException, MessagingException {
  16. // 1.创建一个程序与邮件服务器会话对象 Session
  17. Properties props = new Properties();//注意:这里键值对中的键是固定死的
  18. //设置发送的协议
  19. props.setProperty("mail.transport.protocol", "SMTP");
  20. //设置发送邮件的服务器
  21. props.setProperty("mail.host", "smtp.126.com");//不走外网的话可以填localhost
  22. props.setProperty("mail.smtp.auth", "true");// 指定验证为true
  23. // 创建验证器
  24. Authenticator auth = new Authenticator() {
  25. public PasswordAuthentication getPasswordAuthentication() {
  26. //设置发送人的帐号和密码
  27. return new PasswordAuthentication("abc", "a");
  28. }
  29. };
  30. Session session = Session.getInstance(props, auth);
  31. // 2.创建一个Message,它相当于是邮件内容
  32. Message message = new MimeMessage(session);
  33. //设置发送者
  34. message.setFrom(new InternetAddress("abc@126.com"));
  35. //设置发送方式与接收者
  36. message.setRecipient(RecipientType.TO, new InternetAddress(email));
  37. //设置邮件主题
  38. message.setSubject("邮件主题");
  39. // message.setText("这是一封激活邮件,请<a href='#'>点击</a>");
  40. //设置邮件内容
  41. message.setContent(emailMsg, "text/html;charset=utf-8");
  42. // 3.创建 Transport用于将邮件发送
  43. Transport.send(message);
  44. }
  45. }

使用举例:

  1. package
  2. import javax.mail.MessagingException;
  3. import javax.mail.internet.AddressException;
  4. public class MyTest {
  5. public static void main(String[] args) throws Exception {
  6. //给自己的b账户发邮件
  7. MyMailUtils.sendMail("b@estore.com","嘿嘿");
  8. System.out.println("完事...");
  9. }
  10. }

4 综合案例-发生日祝福

4.1 需求

当服务器启动的时候,查询数据库中今天过生日的用户,并给这些用户发送生日祝福邮件;

4.2 技术分析

1:要想知道服务器已经启动了,就需要使用web中的监听器来完成;
2:延迟一定的时间或每间隔一定的时间做事情,需要使用java中的定时任务完成;
3:使用java程序,发送电子邮件;

4.3 步骤实现

1:环境搭建;(监听器,service,dao,domain,utils)
2:创建数据库和模型类及三层包结构;
3:编写一个监听器;(监听ServletContext对象的创建);当触发的时候,查询数据库中今天过生日的所有用户,发送祝福邮件;