JavaWeb 核心技术之 监听器Listener

一、监听器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

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值