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 电子邮件的发送与读取流程
3.3 电子邮件的发送与接收协议介绍
发送协议:SMTP协议,用于多台邮件服务器之间进行邮件交互。
发邮件的端口号: 25
接收协议:POP3协议,用于账户与服务器之间邮件的查收。
收邮件的端口号: 110
3.4 易邮邮件服务器的安装与使用
1:安装步骤;(直接下一步)
2:会提示无法使用浏览器;忽略即可;
3:配置服务器;
4:账号添加;(注册)
5:安装客户端软件(FoxMail),配置账户
3.5 使用java代码发送电子邮件
使用mail.jar可以完成电子邮件的发送。
Java代码发送邮件的步骤:(了解)
1:创建一个session会话对象(邮件服务器上的session会话对象);
2:设置登录的账户和密码;(设置发件人)
3:编写邮件内容;(发给谁)
4:发送邮件;(工具类的静态方法)
读已经编写好的工具类:
mustang_MailUtils
package
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
public class mustang_MailUtils {
public static void sendMail(String email, String emailMsg)
throws AddressException, MessagingException {
// 1.创建一个程序与邮件服务器会话对象 Session
Properties props = new Properties();//注意:这里键值对中的键是固定死的
//设置发送的协议
props.setProperty("mail.transport.protocol", "SMTP");
//设置发送邮件的服务器
props.setProperty("mail.host", "smtp.126.com");//不走外网的话可以填localhost
props.setProperty("mail.smtp.auth", "true");// 指定验证为true
// 创建验证器
Authenticator auth = new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
//设置发送人的帐号和密码
return new PasswordAuthentication("abc", "a");
}
};
Session session = Session.getInstance(props, auth);
// 2.创建一个Message,它相当于是邮件内容
Message message = new MimeMessage(session);
//设置发送者
message.setFrom(new InternetAddress("abc@126.com"));
//设置发送方式与接收者
message.setRecipient(RecipientType.TO, new InternetAddress(email));
//设置邮件主题
message.setSubject("邮件主题");
// message.setText("这是一封激活邮件,请<a href='#'>点击</a>");
//设置邮件内容
message.setContent(emailMsg, "text/html;charset=utf-8");
// 3.创建 Transport用于将邮件发送
Transport.send(message);
}
}
使用举例:
package
import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
public class MyTest {
public static void main(String[] args) throws Exception {
//给自己的b账户发邮件
MyMailUtils.sendMail("b@estore.com","嘿嘿");
System.out.println("完事...");
}
}
4 综合案例-发生日祝福
4.1 需求
当服务器启动的时候,查询数据库中今天过生日的用户,并给这些用户发送生日祝福邮件;
4.2 技术分析
1:要想知道服务器已经启动了,就需要使用web中的监听器来完成;
2:延迟一定的时间或每间隔一定的时间做事情,需要使用java中的定时任务完成;
3:使用java程序,发送电子邮件;
4.3 步骤实现
1:环境搭建;(监听器,service,dao,domain,utils)
2:创建数据库和模型类及三层包结构;
3:编写一个监听器;(监听ServletContext对象的创建);当触发的时候,查询数据库中今天过生日的所有用户,发送祝福邮件;