一、监听器Listener
项目地址:https://github.com/YueMa233/JavaWeb_01
javaEE包括13门规范,我们主要学习的是servlet技术和jsp技术,其中servlet规范包括三个技术点:servlet、listener、和filter。
1.什么是监听器?
监听器就是监听某个对象的状态变化的组件。
监听器的相关概念:
事件源:被监听的对象。
监听器:监听事件源对象,事件源对象的状态的变化会触发监听器。
注册监听器:将监听器与事件源进行绑定
响应行为:监听器监听到事件源的状态变化后所涉及到的代码功能。
三个域对象:request、session、servletContext对象。
2.监听器有哪些
第一维度:按照被监听对象划分为 servletRequest域、HttpSession域、ServletContext域。
第二维度:按照监听的内容分为监听对象创建与销毁的、监听对象属性变化的。
ServletConext域 | HttpSession域 | ServletRequest域 | |
域对象创建与销毁 |
ServletConextListener |
HttpSessionListener |
ServletRequestListener |
域对象的属性变化 |
ServletConextAttributeListener |
HttpSessionAttributeListener |
ServletRequestAttributeListener |
3.监听三大域对象的创建与销毁的监听器
(1)监听ServletContext域的创建与销毁的监听器ServletContextListener
1)Servlet域的生命周期
何时创建:服务器启动创建
何时销毁:服务器关闭销毁
2)监听器编写步骤:
a、编写一个监听器类去实现监听端口
b、覆盖监听器的方法
package com.ma.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyServletContextListener implements ServletContextListener {
@Override
//监听Context域对象创建
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("Context创建了...");
}
@Override
//监听Context域对象销毁
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("Context销毁了...");
}
}
c、需要在web.xml中进行配置
<!--注册ServletContext监听器-->
<listener>
<listener-class>com.ma.listener.MyServletContextListener</listener-class>
</listener>
3)监听的方法
创建对象时执行
销毁对象时执行
4)配置文件
5)ServletContextListener监听器的主要作用
a、初始化的工作
b、加载一些初始化的文件
c、任务调度
//开启一个计息任务调度---每晚12点计息一次
Timer timer = new Timer();
//修改为真实银行计息
//1.起始时间:当晚12点
//2.间隔时间:24小时
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String currentTime = "2018-10-04 00:00:00";
Date parse = null;
try {
parse = format.parse(currentTime);
} catch (ParseException e) {
e.printStackTrace();
}
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("银行计息了...");
}
}, parse, 24*60*60*1000);
(2)监听 HttpSession域的创建与销毁的监听器 HttpSession
1) HttpSession域的生命周期
何时创建:客户端访问服务器端,服务器端没有该客户端的session时创建。
何时销毁:
1.关闭服务器
2.手动关闭
3.过期
2)监听器编写步骤:
a、编写一个监听器类去实现监听端口
b、覆盖监听器的方法
package com.ma.listener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MyHttpSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("session创建了..." + se.getSession().getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
System.out.println("session销毁了...");
}
}
c、需要在web.xml中进行配置
<!--注册HttpSession监听器-->
<listener>
<listener-class>com.ma.listener.MyHttpSessionListener</listener-class>
</listener>
3)监听的方法
创建对象时执行
销毁对象时执行
4)配置文件
5) HttpSession监听器的主要作用
统计用户情况
(3)监听ServletRequest域的创建与销毁的监听器 ServletRequest
1)ServletRequest域的生命周期
何时创建:每一次请求都会创建request
何时销毁:请求结束
2)监听器编写步骤:
a、编写一个监听器类去实现监听端口
b、覆盖监听器的方法
package com.ma.listener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
public class MyServletRequestListener implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
System.out.println("MyServletRequestListener创建了...");
}
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
System.out.println("MyServletRequestListener销毁了...");
}
}
c、需要在web.xml中进行配置
<!--注册ServletRequestListener监听器-->
<listener>
<listener-class>com.ma.listener.MyServletRequestListener</listener-class>
</listener>
3)监听的方法
创建对象时执行
销毁对象时执行
4)配置文件
5)ServletRequest监听器的主要作用
(4)监听三大域对象的属性变化
域对象的通用的方法
setAttribute(name, value)
-触发添加属性的监听的方法
-触发修改属性的监听器的方法
getAttribute(name)
removeAttribute
-触发删除属性的监听器的方法
1)ServletContextAttributeListener
监听方法
package com.ma.attributelistener;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
public class MyServletContextAttributeListener implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
//放到域中的name
System.out.println(servletContextAttributeEvent.getName());
//放到域中的value
System.out.println(servletContextAttributeEvent.getValue());
}
@Override
public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
//域中删除的name
System.out.println(servletContextAttributeEvent.getName());
//域中删除的value
System.out.println(servletContextAttributeEvent.getValue());
}
@Override
public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
//域中修改前的name
System.out.println(servletContextAttributeEvent.getName());
//域中修改前的value
System.out.println(servletContextAttributeEvent.getValue());
}
}
属性配置
!--注册属性变化监听器-->
<listener>
<listener-class>com.ma.attributelistener.MyServletContextAttributeListener</listener-class>
</listener>
2)HttpSessionAttributeListener
监听方法
package com.ma.attributelistener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
//放到域中的name
System.out.println(httpSessionBindingEvent.getName());
//放到域中的value
System.out.println(httpSessionBindingEvent.getValue());
}
@Override
public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
//域中删除的name
System.out.println(httpSessionBindingEvent.getName());
//域中删除的value
System.out.println(httpSessionBindingEvent.getValue());
}
@Override
public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
//域中修改前的name
System.out.println(httpSessionBindingEvent.getName());
//域中修改前的value
System.out.println(httpSessionBindingEvent.getValue());
}
}
属性配置
<!--注册属性变化监听器-->
<listener>
<listener-class>com.ma.attributelistener.MyHttpSessionAttributeListener</listener-class>
</listener>
3)ServletRequestAttributeListener
监听方法
package com.ma.attributelistener;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
public class MyServletRequestAttributeListener implements ServletRequestAttributeListener {
@Override
public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {
//放到域中的name
System.out.println(servletRequestAttributeEvent.getName());
//放到域中的value
System.out.println(servletRequestAttributeEvent.getValue());
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {
//域中删除的name
System.out.println(servletRequestAttributeEvent.getName());
//域中删除的value
System.out.println(servletRequestAttributeEvent.getValue());
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {
//域中修改前的name
System.out.println(servletRequestAttributeEvent.getName());
//域中修改前的value
System.out.println(servletRequestAttributeEvent.getValue());
}
}
属性配置
<!--注册属性变化监听器-->
<listener>
<listener-class>com.ma.attributelistener.MyServletRequestAttributeListener</listener-class>
</listener>
4.与session中的绑定对象相关的监听器
(1)即将要被绑定到session中的对象有几种状态
TestHttpSessionBindingServlet
绑定状态:就是一个对象放到session域中
解绑状态:就是这个对象从session域中移除了
package com.ma.domain;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class User implements HttpSessionBindingListener {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("User对象被绑定了...");
}
@Override
public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("User对象解除绑定了...");
}
}
测试代码
package com.ma.testdomain;
import com.ma.domain.User;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet(name = "TestHttpSessionBindingServlet")
public class TestHttpSessionBindingServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//将对象绑定到session域中
HttpSession session = request.getSession();
User user01 = new User();
user01.setId(1);
user01.setName("Tom");
//绑定User
session.setAttribute("user01",user01);
//解绑User
session.removeAttribute("user01");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
(当用户很多时候可以通过钝化对服务器进行优化)
HttpSessionActivationListener
钝化状态:是将session内存中的对象持久化到磁盘(对象被钝化)
活化状态:是将磁盘上的对象再次恢复到session内存中(对象被活化)
package com.ma.domain;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;
import java.io.Serializable;
public class Customer implements HttpSessionActivationListener,Serializable {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void sessionWillPassivate(HttpSessionEvent httpSessionEvent) {
System.out.println("Customer钝化了...");
}
@Override
public void sessionDidActivate(HttpSessionEvent httpSessionEvent) {
System.out.println("Customer活化了...");
}
}
测试代码
package com.ma.testdomain;
import com.ma.domain.Customer;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet(name = "TestHttpSessionActivationListenerServlet")
public class TestHttpSessionActivationListenerServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
Customer customer01 = new Customer();
customer01.setId(1);
customer01.setName("Jerry");
//将对象放到session域中
session.setAttribute("customer01",customer01);
System.out.println("customer01被放到session域中了...");
}
}
二、邮箱服务器
邮件的客户端:可以只安装在电脑上的也可以是网页形式的。
邮件服务器:起到邮件的接收和推送作用。
邮件的发送协议:
协议:就是数据传输的约束。
接收邮件的协议:POP3、IMAP
推送邮件的协议:SMTP