Part01:Listener监听器
1、Listener监听器的概念:
- 监听器其实就是一个实现特定接口的普通Java程序,这个程序专门用于监听另一个Java对象的方法的调用或者属性改变,当被监听对象发生上述事件后,监听器某个方法立即被执行
2、Listener监听器的作用
- 监听JavaWeb的三个对象:ServletContext、ServletRequest、HttpSession
3、编写一个Listener监听器:
- 新建一个类,实现监听器接口,重写方法
public class ServletContext implements ServletContextListener {
//创建ServletContext时自动执行
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("ServletContext 创建了");
}
//销毁ServletContext时自动执行
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("ServletContext 销毁了");
}
}- 在web.xml文件中编写配置文件,注册listener
<listener>
<listener-class>Demo01.ServletContext</listener-class>
</listener>4、监听器的分类:
- 监听三个对象的创建和销毁
- ServletContextListener
- 创建:服务器启动的时候,会为每一个项目创建一个
- 销毁:服务器正常关闭或者项目被移除的时候
- ServletRequestListener
- 创建:请求来的时候
- 销毁:生成响应的时候
- HttpSessionListener
- 创建:Java中认为第一次调用request.getSession( )时创建,JSP中认为第一次访问JSP页面时创建
- 销毁:服务器非正常关闭时、超时、手动销毁
- 监听三个对象属性的变化(添加、替换、删除)
- ServletContextAttributeListener
- ServletRequestAttributeListener
- HttpSessionAttributeListener
- getValue( )返回已添加、移除或替换的属性的值。如果添加了属性,则这是属性的值,如果移除了属性,则这是被移除属性的值,如果替换了属性,则这是属性原来的值
public class ServletContextAttribute implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("ServletContext 属性添加了"+servletContextAttributeEvent.getName()+":"+servletContextAttributeEvent.getValue());
}
@Override
public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("ServletContext 属性移除了"+servletContextAttributeEvent.getName()+":"+servletContextAttributeEvent.getValue());
}
@Override
public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("ServletContext 属性替换了"+servletContextAttributeEvent.getName()+":"+servletContextAttributeEvent.getValue());
}
}
- 监听JavaBean在Session中的状态变化
- HttpSessionBindingListener:解绑和绑定
- 绑定:JavaBean放入了session
- 解绑:JavaBean从session中移除了
- HttpSessionActivationListener:钝化和活化
- 钝化:把session中的JavaBean序列化到磁盘上
- 活化:将JavaBean从磁盘中取回到session中
- 注意:只需JavaBean实现接口即可,不需要配置文件,活化和钝化还需要实现序列化接口Serializable。
Part02:定时器
1、定时器概念:
- 调用线程执行任务,可安排任务执行一次,或者定期重复执行
2、定时器的创建:
- new Timer( )
3、常用方法:
- void schedule(TimerTask task,Date firstTime,long period);//指定一个开始时间firstTime,间隔指定时间period再次执行任务
- void schedule(TimerTask task, long delay,long period);//延迟一段时间delay,间隔指定时间period再次执行任务
public class Timer1 {
public static void main(String[] args){
//获取当前时间
Date date = new Date();
System.out.println("当前时间为"+date.toLocaleString());
System.out.println("延迟4秒后,执行任务");
//获取Timer
Timer timer = new Timer();
//延迟4秒,每隔一秒打印一下当前时间
timer.schedule(new TimerTask() {
@Override
public void run() {
Date date = new Date();
System.out.println(date.toLocaleString());
}
},4000,1000);
}
}
Part03:Calendar日历对象
1、获取日历对象:Calendar.getInstance( )
2、常用方法:
- setTime(Date date);//与当前时间同步
- set(int filed, int value);//将给定的日历字段设置为给定值
- getTime( );//返回日历的date对象
public class Calendar1 {
public static void main(String[] args){
//获取日历对象
Calendar calendar = Calendar.getInstance();
//设置为日历对象时间为当前时间
calendar.setTime(new Date());
//设置年份为2020年
calendar.set(Calendar.YEAR,2020);
System.out.println(calendar.getTime().toLocaleString());
}
}Part04:自动发送邮件案例
1、案例需求:
- 在服务器启动的时候,分派一个任务,去数据库查询当天过生日的用户,为每个过生日的用户发送生日祝福邮件
2、邮件服务器:
- 通过服务器可以接收或发送服务器
3、电子邮箱:
- 就是在服务器开辟了一块空间
4、协议:规定数据的格式
- 发送数据协议:SMTP
- 接收邮件协议:POP、POP3、IMAP
5、案例实现:
- 步骤分析
- 创建数据库和表结构
- 创建动态的web项目
- 创建包结构
- 导入案例需要的资源
- 使用ServletContextListener监听器监听服务器启动
- 创建一个任务(定时器)
- 获取到明日00:00:00(开始时间)
- 一天(间隔时间)
- 创建service,dao操作数据库查询出当天过生日的用户
- 遍历
- 调用MailUtils自动发送邮件
- 以下为延迟4秒,每隔1秒给当天生日的用户发送生日邮件测试图片
- Listener代码
package Demo04.listener;
import Demo04.bean.User;
import Demo04.service.MailService;
import Demo04.utils.DateUtils;
import Demo04.utils.MailUtils;
import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
public class MailListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
//创建一个定时器
Timer timer = new Timer();
//定时发送邮件,(延迟时间:从现在到第二天0时0分0秒所差的时间,间隔时间:一天)
timer.schedule(new TimerTask() {
@Override
public void run() {
//调用方法查询生日在当天的用户
MailService mailService = new MailService();
try {
//获取日历对象
Calendar calendar = Calendar.getInstance();
//设置为日历对象时间为当前时间
calendar.setTime(new Date());
//获取当前的月份和日期
int month=calendar.get(Calendar.MONTH)+1;
int day=calendar.get(Calendar.DAY_OF_MONTH);
String birthday = "%-0"+month+"-0"+day;
//System.out.println(birthday);
List<User> users = mailService.queryUsers(birthday);
//System.out.println(users);
if(users != null){
for(User user:users){
String email = user.getEmail();
String emailMsg = "亲爱的"+user.getUsername()+",生日快乐?!";
MailUtils.sendMail(email,emailMsg);
System.out.println(user.getUsername()+":邮件发送成功");
}
}
} catch (SQLException e) {
e.printStackTrace();
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
},DateUtils.getDelayTime(),DateUtils.getOneDay());
// },4000,1000);
System.out.println();
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
}
}- Dao代码
package Demo04.dao;
import Demo04.bean.User;
import Demo04.utils.C3P0Utils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import java.sql.SQLException;
import java.util.List;
public class MailDao {
public List<User> queryUsers(String birthday) throws SQLException {
//创建QueryRunner对象
QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
//编写SQL语句
String sql = "select * from user where birthday like ?”;
//执行SQL语句
List<User> users = queryRunner.query(sql, new BeanListHandler<User>(User.class),birthday);
return users;
}
}- service代码
package Demo04.service;
import Demo04.bean.User;
import Demo04.dao.MailDao;
import java.sql.SQLException;
import java.util.List;
public class MailService {
public List<User> queryUsers(String birthday) throws SQLException {
MailDao mailDao = new MailDao();
return mailDao.queryUsers(birthday);
}
}- DateUtils代码
package Demo04.utils;
import java.util.Calendar;
import java.util.Date;
public class DateUtils {
/**
* 获得当前时间距离给定天数零点的毫秒时间
* @param amount
* @return
*/
public static Long getDelayTime(int amount){
//1 设置当前时间
Calendar calendar = Calendar.getInstance();
Date newDate = new Date();
calendar.setTime(newDate);
//2 将时分秒设置成0
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
//3 设置指定天数
calendar.add(Calendar.DATE, amount);
//4 计算当前时间距离设置日期零点的延迟时间
return calendar.getTimeInMillis() - newDate.getTime();
}
/**
* 当前时间具体明天零点的毫秒时间
* @return
*/
public static Long getDelayTime(){
return getDelayTime(1);
}
/**
* 获得一天的毫秒值
* @return
*/
public static Long getOneDay(){
return 24 * 60 * 60 * 1000L;
}
/**
* 获得几月(两位)
* @return
*/
public static String getCurrentMonth(){
//1 设置当前时间
Calendar calendar = Calendar.getInstance();
Date newDate = new Date();
calendar.setTime(newDate);
int m = calendar.get(Calendar.MONTH) + 1;
if(m < 10){
return "0" + m;
}
return "" + m;
}
/**
* 获得几号(两位)
* @return
*/
public static String getCurrentDay(){
//1 设置当前时间
Calendar calendar = Calendar.getInstance();
Date newDate = new Date();
calendar.setTime(newDate);
int d = calendar.get(Calendar.DATE);
if(d < 10){
return "0" + d;
}
return "" + d;
}
}- MailUtils代码
package Demo04.utils;
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 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", "localhost");
props.setProperty("mail.smtp.auth", "true");// 指定验证为true
// 创建验证器
Authenticator auth = new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
//设置发送人的帐号和密码
return new PasswordAuthentication("ttsz@ttsz.com", "123");
}
};
Session session = Session.getInstance(props, auth);
// 2.创建一个Message,它相当于是邮件内容
Message message = new MimeMessage(session);
//设置发送者
message.setFrom(new InternetAddress("ttsz@ttsz.com"));
//设置发送方式与接收者
message.setRecipient(, new InternetAddress(email));
//设置邮件主题
message.setSubject("生日祝福");
//设置邮件内容
message.setContent(emailMsg, "text/html;charset=utf-8");
// 3.创建 Transport用于将邮件发送
Transport.send(message);
}
}
















