Java Listener学习

版权声明:本文为setlilei原创文章 转载请注明来源 https://blog.csdn.net/setlilei/article/details/85058852

共有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中对象已钝化");
	}
}

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) {

	}

}

猜你喜欢

转载自blog.csdn.net/setlilei/article/details/85058852