Web-第十七天 监听器Listener【悟空教程】
今日内容介绍
今日内容学习目标
当我们使用QQ时,在生日当天会收到QQ系统发送的祝福邮件。今天我们将实现相同的功能。
<listener>
<listener-class></listener-class>
</listener>
作者:王红 著
当当 广告
购买
ServletRequestListener | 监听Request对象创建或销毁javax.servlet.ServletRequestListener | |
---|---|---|
request创建方法* 请求开始创建 | requestInitialized(ServletRequestEvent sre) | |
request销毁方法* 请求结束时销毁 | requestDestroyed(ServletRequestEvent sre) | |
事件对象 | ServletRequestEventl ServletContext getServletContext() l ServletRequest getServletRequest() |
HttpSessionListener | 监听Session对象创建或销毁javax.servlet.http.HttpSessionListener | |
---|---|---|
session创建方法* 第一个调用getSession() | sessionCreated(HttpSessionEvent se) | |
session销毁方法1. 默认30分钟,web.xml可配置2. 执行api手动销毁,invalidate()3. 服务器非正常关闭 | sessionDestroyed(HttpSessionEvent se) | |
事件对象 | HttpSessionEventl getSession() 获得session |
ServletContextListener | 监听ServletContext对象创建或销毁javax.servlet.ServletContextListener | |
---|---|---|
ServletContext创建方法* 服务器启动时 | contextInitialized(ServletContextEvent sce) | |
ServletContext销毁方法* 服务器正常关闭时 | contextDestroyed(ServletContextEvent sce) | |
事件对象 | ServletContextEventl ServletContext getServletContext() |
作用域属性操作:setAttribute(k,v) / getAttribute(k) / removeAttribute(k)
ServletRequestAttributeListener | 监听request对象属性attribute 添加、替换、删除javax.servlet.ServletRequestAttributeListener | |
---|---|---|
添加* 第一次设置数据 | attributeAdded(ServletRequestAttributeEvent srae) | |
替换* 第二次设置数据-- 通过event 获得old数据,如果希望获得new数据,需要request.getAttriubute 获得 | attributeReplaced(ServletRequestAttributeEvent srae) | |
删除 | attributeRemoved(ServletRequestAttributeEvent srae) | |
事件对象 | ServletRequestAttributeEventl getName() l getValue() l getServletContext() l getServletRequest() |
HttpSessionAttributeListener | 监听session对象属性attribute 添加、替换、删除javax.servlet.http.HttpSessionAttributeListener | |
---|---|---|
添加 | attributeAdded(HttpSessionBindingEvent event) | |
替换 | attributeReplaced(HttpSessionBindingEvent event) | |
删除 | attributeRemoved(HttpSessionBindingEvent event) | |
事件对象 | HttpSessionBindingEvent l getName() l getValue() l getSession() |
ServletContextAttributeListener | 监听servletcontext对象属性attribute 添加、替换、删除javax.servlet.ServletContextAttributeListener | |
---|---|---|
添加 | attributeAdded(ServletContextAttributeEvent event) | |
替换 | attributeReplaced(ServletContextAttributeEvent event) | |
删除 | attributeRemoved(ServletContextAttributeEvent event) | |
事件对象 | ServletContextAttributeEvent l getName() l getValue() l getServletContext() |
--特殊的两个监听器不需要再web.xml配置,其他的6个都需配置<listener>。
HttpSessionBindingListener | 监听特殊JavaBean在session作用域绑定或解绑javax.servlet.http.HttpSessionBindingListener,javabean必须实现该接口 | |
---|---|---|
绑定* 给作用域添加数据 | valueBound(HttpSessionBindingEvent event) | |
解绑* 从作用域移除数据 | valueUnbound(HttpSessionBindingEvent event) | |
事件对象 | HttpSessionBindingEvent l getName() l getValue()l getSession() | |
注意:1.javabean必须实现接口,不需要再web.xml注册。2. HttpSessionAttributeListener 和HttpSessionBindingListener 对比HttpSessionAttributeListener 必须在web.xml注册,监听任意对象。HttpSessionBindingListener 不需要再web.xml注册,只对当前javabean进行监听。 |
HttpSessionActivationListener | 监听特殊JavaBean在session作用域钝化或活化javax.servlet.http.HttpSessionActivationListener,javabean必须实现该接口钝化:在服务器正常关闭时,将session作用域的数据写入到文件活化:在服务器启动时,将指定文件中的内容加载到session作用域。 | |
---|---|---|
活化 | sessionDidActivate(HttpSessionEvent se) | |
钝化 | sessionWillPassivate(HttpSessionEvent se) | |
事件对象 | HttpSessionEvent l getSession() | |
注意:1. 必须实现序列号接口,java.io.Serializable,否则抛异常:java.io.NotSerializableException2. 持久化session数据到指定的位置: %tomcat%\work\Catalina\localhost\项目名称\SESSIONS.ser |
public class PathServletContextListener implements ServletContextListener {
//初始化方法
public void contextInitialized(ServletContextEvent sce) {
String contextLocation = sce.getServletContext().getInitParameter("contextLocation");
System.out.println("contextLocation " + contextLocation);
}
//销毁方法
public void contextDestroyed(ServletContextEvent sce) {
}
}
<!-- 配置系统初始化参数 -->
<context-param>
<param-name>contextLocation</param-name>
<param-value>/my2.xml</param-value>
</context-param>
<!-- 配置监听器 -->
<listener>
<listener-class>
cn.com.javahelp.web.servlet.PathServletContextListener
</listener-class>
</listener>
/* 邮件发送过程
* * smtp协议:邮件发送协议,端口号:25
* * pop3协议:邮件接收协议,端口号:110
* 使用java程序发送邮件,采用smtp协议。java提供 javamail用于发送邮件的,代码固定
* 126 --> javahelp@126.com //账号不存在,需要自己注册
* 163 --> javahelp@163.com //账号不存在,需要自己注册
*/
public static void main(String[] args) throws Exception {
//0.1 服务器的设置
Properties props = new Properties();
props.setProperty("mail.host", "smtp.126.com");
props.setProperty("mail.smtp.auth", "true");
//0.2 账号和密码
Authenticator authenticator = new Authenticator(){
@Override
protected PasswordAuthentication getPasswordAuthentication() {
//126账号和密码(模拟账号,需要自己注册)
return new PasswordAuthentication("javahelp","123456");
}
};
//1 与126服务器建立连接:Session
Session session = Session.getDefaultInstance(props, authenticator);
//2 编写邮件:Message
Message message = new MimeMessage(session);
//2.1 发件人(模拟账号)
message.setFrom(new InternetAddress("javahelp@126.com"));
//2.2 收件人 , to:收件人 , cc :抄送,bcc:暗送(密送)。(模拟账号)
message.setRecipient(RecipientType.TO, new InternetAddress("javahelp@163.com"));
//2.3 主题
message.setSubject("这是我们得第一份邮件");
//2.4 内容
message.setContent("哈哈,您到我的商城注册了。", "text/html;charset=UTF-8");
//3 将消息进行发送:Transport
Transport.send(message);
}
System.out.println(new Date().toLocaleString());
//1 定时器核心类
Timer timer = new Timer();
//2 定时执行指定任务
// 参数1:需要执行的任务
// 参数2:执行任务的延迟时间,单位:毫秒
// 参数3:执行任务的轮回时间(周期),单位:毫秒
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println(new Date().toLocaleString());
}
}, 2000, 4000);
create database day23_db;
use day23_db;
create table t_user(
id int primary key auto_increment,
username varchar(50),
birthday date,
email varchar(100)
);
insert t_user(username,birthday,email) values('jack','2015-12-12','javahelp_lt@163.com');
insert t_user(username,birthday,email) values('rose','2015-12-12','javahelp_lt@163.com');
insert t_user(username,birthday,email) values('tom','2015-12-12','javahelp_lt@163.com');
//实现类
public class SendMailListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce) {
}
public void contextDestroyed(ServletContextEvent sce) {
}
}
//web.xml配置内容
<listener>
<listener-class>cn.com.javahelp.web.listener.SendMailListener</listener-class>
</listener>
public class SendMailListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce) {
//1 启动定时器,凌晨12点执行run()方法
new Timer().schedule(new TimerTask() {
@Override
public void run() {
try {
// 2.查询所有 查询所有的用户
UserService userService = new UserService();
// 3.查询当前过生日的所有人
List<User> findAll = userService.findAllWithBirthday();
for (User user : findAll) {
EmailUtils.send(user);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}, DateUtils.getDelayTime(), DateUtils.getOneDay());
}, 100, DateUtils.getOneDay()); //测试程序,运行后100毫秒执行
}
public class User {
private Integer id;
private String username;
private String password;
private String email;
private String nickname;
private String gender;
private String birthday;
public class UserService {
/**
* 查询当天过生日的用户
* @return
* @throws SQLException
*/
public List<User> findAllWithBirthday() throws SQLException {
UserDao userDao = new UserDao();
return userDao.findAllWithBirthday();
}
}
public class UserDao {
public List<User> findAllWithBirthday() throws SQLException {
// 查询条件:-06-12
String birthday = "-"+DateUtils.getCurrentMonth()+"-" + DateUtils.getCurrentDay();
System.out.println(birthday);
QueryRunner queryRunner = new QueryRunner(JdbcUtils.getDataSource());
String sql = "select * from t_user where birthday like ?";
Object[] params = {"%"+birthday+"%"};
return queryRunner.query(sql, new BeanListHandler<User>(User.class), params);
}
}