共有8个类
生命周期 tomcat启动后创建 tomcat关闭后销毁
对象名称 | 监听事件 |
---|---|
ServletContextListener | ServletContext域对象的创建与销毁 |
HttpSessionListener | Session域对象的创建与销毁 |
ServletRequestListener | Request域对象的创建与销毁 |
ServletContextAttributeListener | ServletContext域对象的属性改变时 |
HttpSessionAttributeListener | Session域对象的属性改变时 |
ServletRequestAttributeListener | Request域对象的属性改变时 |
HttpSessionBindingListener | 被绑定到session中的对象添加或删除后触发 |
HttpSessionActivationListener | session中的对象活化钝化后触发 |
<!--把Listener注册到web.xml中-->
<listener>
<listener-class>com.java.TestListener</listener-class>
</listener>
//ServletContextListene示例
public class TestListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
Object source = sce.getSource();//获得被监听的对象(需要强转使用)
ServletContext servletContext = sce.getServletContext();//获得被监听的对象
System.out.println("ServletContext域创建 - - -");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext域销毁 - - -");
}
}
注意点击此处是关闭java虚拟机 整个java都关闭不会运行java监听器方法
点击此处是关闭javaweb程序 可以运行java监听器方法
private static int i;
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext域创建 - - -");
Timer timer = new Timer();
//方法参数分别为 TimerTask的实现类对象 开始执行时间 执行间隔时间(毫秒)
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
i++;
System.out.println("第"+i+"次调用");
}
}, new Date(), 5000);
}
//使用listener实现任务调度 明天晚上0点开始执行 一天执行一次
private static int i;
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext域创建 - - -");
String strTime = "2018-12-18 00:00:00";
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = null;
try {
date = format.parse(strTime);
} catch (ParseException e) {
e.printStackTrace();
}
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
i++;
System.out.println("第"+i+"天调用");
}
}, date, 1000*60*60*24);
System.out.println(format);
}
//HttpSessionListener示例
public class TestListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("session已创建"+se.getSession().getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("session已销毁");
}
}
//jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>访问jsp页面默认session域对象会自动创建</h1>
</body>
</html>
ServletRequestListener与前两个域对象类似
域对象都有这三个方法
setAttrbute(name,value)
--触发添加属性的监听器的方法
--触发修改属性的监听器的方法
getAttrbute(name)
--不触发任何方法
removeAttrbute(name)
--触发删除属性的监听器的方法
ServletContextAttributeListener|ServletContext域对象的属性改变时
HttpSessionAttributeListener|Session域对象的属性改变时
ServletRequestAttributeListener|Request域对象的属性改变时
//servlet代码
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext context = this.getServletContext();
//在ServletContext中添加数据
context.setAttribute("name", "test1");
//修改ServletContext的数据
context.setAttribute("name", "test2");
//删除ServletContext的数据
context.removeAttribute("name");
}
//ServletContextAttributeListener代码
public class TestListener implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent scab) {
String name = scab.getName();//获取域对象中的name--name
Object value = scab.getValue();//获取域对象中的value--test1
}
@Override
public void attributeRemoved(ServletContextAttributeEvent scab) {
String name = scab.getName();//获取修改前域对象中的name--name
Object value = scab.getValue();//获取修改前域对象中的value--test1
}
@Override
public void attributeReplaced(ServletContextAttributeEvent scab) {
String name = scab.getName();//删除域对象中的name--name
Object value = scab.getValue();//删除域域对象中的value--test2
}
}
HttpSessionAttributeListener(与前者域对象类似)
ServletRequestAttributeListener(与前者域对象类似)
session的其他监听器
//对象感知监听器 session中的对象绑定与解绑 HttpSessionBindingListener
public class TestJava implements HttpSessionBindingListener{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//该对象被绑定到session中后触发
@Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("已被session绑定");//即把当前类的对象添加到session域
}
//该对象从session中解绑后触发
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("已被session解绑");//即添加到session域中当前类实例化后的对象
}
}
//钝化和活化监听器 HttpSessionActivationListener 需实现Serializable方可活化
public class TestJava implements HttpSessionActivationListener, Serializable {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
// 该对象活化后调用此方法
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println("session中对象已活化");
}
@Override
// 该对象钝化后调用此方法
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println("session中对象已钝化");
}
}
默认tomcat默认开启session持久化 当tomcat服务器关闭后会把未销毁的session钝化 持久到本地SESSIONS.ser文件中
再次开启tomcat时 tomcat会把已经钝化的session活化(前提是session中的该对象实现Serializable接口)
<!--在WebContent -> META-INF下新建content.xml 以下手动来控制session钝化和活化-->
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<!-- maxIdleSwap:session中的对象多长时间不使用就钝化 -->
<!-- directory:钝化后的对象的文件写到磁盘的哪个目录下
配置钝化的对象文件在 work/catalina/localhost/钝化文件 -->
<Manager className="org.apache.catalina.session.PersistentManager"
maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore"
directory="文件夹名" />
</Manager>
</Context>
//java listener实现定时发送生日邮件祝福
public class BirthdayListener implements ServletContextListener{
@Override
public void contextInitialized(ServletContextEvent sce) {
//当web应用启动 开启任务调度---功能在用户的生日当前发送邮件
//开启一个定时器
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
// 为当前的生日的用户发邮件
//1、获得今天过生日的人
//获得今天的日期
SimpleDateFormat format = new SimpleDateFormat("MM-dd");
String currentDate = format.format(new Date());
//根据当前时间从数据查询今天过生日的人
QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "select * from users where birthday like ?";
List<Customer> customerList = null;
try {
customerList = runner.query(sql, new BeanListHandler<Customer>(Customer.class) ,"%"+currentDate+"%");
} catch (SQLException e) {
e.printStackTrace();
} //08-18
//2、发邮件
if(customerList!=null&&customerList.size()>0){
for(Customer c : customerList){
String emailMsg = "亲爱的 : "+c.getRealname()+"---生日快乐!";
try {
MailUtils.sendMail(c.getEmail(), "生日祝福", emailMsg);
System.out.println(c.getRealname()+"---邮件发送完毕---");
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
}
}, new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse("2018-12-19 00:00:00"), 1000*10);
//起始时间是一个固定的时间 间隔时间是1天 1月 1年
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
}
}