JavaWeb09(Listener监听器、定时器、Calendar日历对象、自动发送邮件案例)

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

    Demo01.ServletContext

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);
    }
}

JavaWeb09(Listener监听器、定时器、Calendar日历对象、自动发送邮件案例)_第1张图片

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、案例实现:

  • 步骤分析
    • 创建数据库和表结构
      JavaWeb09(Listener监听器、定时器、Calendar日历对象、自动发送邮件案例)_第2张图片
      JavaWeb09(Listener监听器、定时器、Calendar日历对象、自动发送邮件案例)_第3张图片
    • 创建动态的web项目
    • 创建包结构
    • 导入案例需要的资源
      JavaWeb09(Listener监听器、定时器、Calendar日历对象、自动发送邮件案例)_第4张图片
    • 使用ServletContextListener监听器监听服务器启动
      • 创建一个任务(定时器)
        • 获取到明日00:00:00(开始时间)
        • 一天(间隔时间)
      • 创建service,dao操作数据库查询出当天过生日的用户
      • 遍历
      • 调用MailUtils自动发送邮件
  • 以下为延迟4秒,每隔1秒给当天生日的用户发送生日邮件测试图片
    JavaWeb09(Listener监听器、定时器、Calendar日历对象、自动发送邮件案例)_第5张图片
    JavaWeb09(Listener监听器、定时器、Calendar日历对象、自动发送邮件案例)_第6张图片
  • 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 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 queryUsers(String birthday) throws SQLException {
        //创建QueryRunner对象
        QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
        //编写SQL语句
        String sql = "select * from user where birthday like ?”;
        //执行SQL语句
        List users = queryRunner.query(sql, new BeanListHandler(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 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("[email protected]", "123");
         }
      };

      Session session = Session.getInstance(props, auth);

      // 2.创建一个Message,它相当于是邮件内容
      Message message = new MimeMessage(session);

      //设置发送者
      message.setFrom(new InternetAddress("[email protected]"));

      //设置发送方式与接收者
      message.setRecipient(RecipientType.TO, new InternetAddress(email)); 

      //设置邮件主题
      message.setSubject("生日祝福");

      //设置邮件内容
      message.setContent(emailMsg, "text/html;charset=utf-8");

      // 3.创建 Transport用于将邮件发送
      Transport.send(message);
   }
}

你可能感兴趣的:(JavaWeb,JavaWeb)