初识Servlet监听器

Servlet监听器简介
Servlet监听器的作用是监听Web容器的有效事件,由容器管理。利用Listener接口监听在容器中的某个执行程序,并更具应用程序的需求做出适当的响应。


监听Servlet上下文
Servlet上下文监听可以监听ServletContext对象的创建、删除和添加属性,以及删除和修改操作,该监听器需要用到下面两个接口。

  • ServletContextListener接口:监听ServletContext的创建和删除。
class myServletContextListener implements ServletContextListener{

    //通知正在收听的对象应用程序已经被加载及初始化
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {

    }

    //通知正在收听的对象应用程序已经被载出,即关闭
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {

    }
}
  • ServletAttributeListener接口:监听ServletContext属性的修改、删除和增加
class myServletAttributeListener implements ServletContextAttributeListener{
    //若有对象加入Application范围,通知正在收听的对象
    @Override
    public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {

    }
    //若有对象从Application范围移除,通知正在收听的对象
    @Override
    public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {

    }
    //若有对象在Application范围内的一个对象被另一个对象替换,通知正在收听的对象
    @Override
    public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {

    }
}

class myServletAttributeListener2 implements ServletRequestAttributeListener{

    @Override
    public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {

    }

    @Override
    public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {

    }

    @Override
    public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {

    }
}

监听HTTP会话

  • HttpSessionListener接口:监听HTTP会话的创建及销毁

class myHttpSessionListener implements HttpSessionListener{

    //通知正在收听的对象,session已经被加载及初始化
    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {

    }
    //通知正在收听的对象,session被载出
    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {

    }
}
  • HttpSessionActivationListener接口:监听HTTP会话active和passivate情况
class myHttpSessionActivationListener implements HttpSessionActivationListener{
    //通知正在收听的对象,其session状态变为有效状态
    @Override
    public void sessionWillPassivate(HttpSessionEvent httpSessionEvent) {

    }
    //通知正在收听的对象,其session状态变为无效状态
    @Override
    public void sessionDidActivate(HttpSessionEvent httpSessionEvent) {

    }
}
  • HttpSessionBindingListener接口:监听HTTP会话中对象的绑定信息,它是唯一不需要再web.xml中设置Listener的。
class myHttpBindingListener implements HttpSessionBindingListener{
    //当有对象加入session的范围时,会被自动调用
    @Override
    public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {

    }
    //当有对象从session的范围移除时,会被自动取消调用
    @Override
    public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {

    }
}
  • HttpSessionAttributeListener接口:监听HTTP会话中属性的设置请求。
class myHttpSessionAttributeListener implements HttpSessionAttributeListener {

    //若有对象加入Session范围,通知正在收听的对象
    @Override
    public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {

    }

    //若有对象从Session范围移除,通知正在收听的对象
    @Override
    public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {

    }

    //若有对象在Session范围内的一个对象被另一个对象替换,通知正在收听的对象
    @Override
    public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {

    }
}

监听Servlet请求

  • ServletRequestListener接口:
class myServletRequestListener implements ServletRequestListener{

    //通知正在收听的对象,ServletRequest已经被加载及初始化
    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {

    }
    //通知正在收听的对象,ServletRequest已经被载出,即关闭
    @Override
    public void requestInitialized(ServletRequestEvent servletRequestEvent) {

    }
}
  • ServletRequestAttributeListener接口:
class myServletRequestAttributeListener implements ServletRequestAttributeListener{
    //若有对象加入Request范围,通知正在收听的对象
    @Override
    public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {

    }
    //若有对象从Request范围移除,通知正在收听的对象
    @Override
    public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {

    }
    //若有对象在Request范围内的一个对象被另一个对象替换,通知正在收听的对象
    @Override
    public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {

    }
}

下面使用一个小例子:使用监听器查看在线用户
UserInfoList类:

package com.java.model;

import java.util.ArrayList;

/**
 * Created with IntelliJ IDEA.
 * Created by YEN on 2016/7/10 and 22:05.
 */
public class UserInfoList {
    private static UserInfoList userInfoList=new UserInfoList();
    private ArrayList arrayList=null;
    public UserInfoList(){
        this.arrayList=new ArrayList();
    }
    public static UserInfoList getInstance(){
        return userInfoList;
    }
    //增加用户
    public boolean addUserInfo(String username){
        if(username!=null){
            this.arrayList.add(username);
            return true;
        }else return false;
    }
    //获取用户列表
    public ArrayList getUserList(){
        return arrayList;
    }
    //移除用户
    public void removeUserInfo(String username){
        if(username!=null){
            arrayList.remove(username);
        }
    }
}

UserInfoTrace类:

package com.java.model;

import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

/**
 * Created with IntelliJ IDEA.
 * Created by YEN on 2016/7/10 and 22:12.
 */

public class UserInfoTrace implements HttpSessionBindingListener{
    private String username;
    private UserInfoList container=UserInfoList.getInstance();
    public UserInfoTrace(){
        this.username="";
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    @Override
    public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("上线................"+this.username);
    }

    @Override
    public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("下线................"+this.username);
        if(username!=""){
            container.removeUserInfo(username);
        }
    }
}

login.jsp页面

<%--
  Created by IntelliJ IDEA.
  User: YEN
  Date: 2016/7/9
  Time: 16:29
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script>
        function checkForm() {
            if(document.getElementById("username").value==null || document.getElementById("username").value==""){
                  alert("用户名不能为空!");
                  return false;
              }
            if(document.getElementById("password").value==null || document.getElementById("password").value==""){
                alert("密码不能为空!");
                return false;
            }
            return true;
        }
    </script>
</head>
<body>
<form name="form1" action="<%=request.getContextPath()%>/showUserInfo.jsp" method="get" onsubmit="return checkForm()">
    username:<input type="text" name="username" id="username">   <br>
    password:<input type="password" name="password" id="password">   <br>
    <input type="submit" value="提交">
</form>
</body>
</html>

showUserInfo.jsp页面

<%--
  Created by IntelliJ IDEA.
  User: YEN
  Date: 2016/7/10
  Time: 22:16
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page import="com.java.model.UserInfoList" language="java" %>
<%@page import="com.java.model.UserInfoTrace" language="java" %>
<%@ page import="java.util.ArrayList" %>
<html>
<head>
    <title>UserInfoPage</title>
</head>
<body>
<%
    UserInfoList userInfoList=UserInfoList.getInstance();  //获得UserInfoList类的对象
    UserInfoTrace userInfoTrace=new UserInfoTrace();       //创建UserInfoTrace类的对象
    request.setCharacterEncoding("UTF-8");
    String username=request.getParameter("username");
    userInfoTrace.setUsername(username);
    session.setAttribute("list",userInfoTrace);
    userInfoList.addUserInfo(username);
    session.setMaxInactiveInterval(30);                   //session过期时间为30s
%>
<textarea rows="8" cols="20">
    <%
        ArrayList arrayList=userInfoList.getUserList();
        if(arrayList!=null && arrayList.size()>0 ){
            for (int i = 0; i < arrayList.size(); i++) {
                out.print(arrayList.get(i));
            }
        }
    %>
</textarea>
</body>
</html>

运行结果:
一:在login.jsp页面输入信息
这里写图片描述
二:点击登陆按钮
这里写图片描述
这里写图片描述

三:在登陆一个用户
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值