Servlet Listener 简单示例

本文代码转载自
《Servlet、JSP和Spring MVC初学指南》
及
http://www.111cn.net/jsp/50/3d5adc1119e253bc749e2d254b47f974.htm

对于一般的Listener下面是例子:

先给出普通的context-listener request-listener session-listener的例子

package listener;

/**
 * Created by admin on 2017/2/21.
 */

import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class AppListener implements ServletContextListener  {
    @Override
    public void contextDestroyed(ServletContextEvent sce){

    }

    @Override
    public void contextInitialized (ServletContextEvent sce){
        ServletContext servletContext = sce.getServletContext();

        Map<String, String> countries = new HashMap<>();
        countries.put("ca", "Canada");
        countries.put("us", "United States");
        servletContext.setAttribute("countries", countries);

    }

}

package listener;

/**
 * Created by admin on 2017/2/21.
 */

import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;

@WebListener
public class PrefStatListener implements ServletRequestListener {
    @Override
    public void requestInitialized(ServletRequestEvent sre){
        ServletRequest servletRequest = sre.getServletRequest();
        servletRequest.setAttribute("start", System.nanoTime());
    }

    @Override
    public void requestDestroyed(ServletRequestEvent sre){
        ServletRequest servletRequest = sre.getServletRequest();
        Long start = (Long) servletRequest.getAttribute("start");
        Long end = System.nanoTime();
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        String uri = httpServletRequest.getRequestURI();
        System.out.println("time taken to execute " + uri + ":" + (end - start) / 1000 + "microseconds");
    }
}

package listener;

/**
 * Created by admin on 2017/2/21.
 */

import java.util.concurrent.atomic.AtomicInteger;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSessionEvent;

@WebListener
public class SessionListener implements HttpSessionListener, ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce){
        ServletContext servletContext = sce.getServletContext();
        servletContext.setAttribute("userCounter", new AtomicInteger());
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce){
    }

    @Override
    public void sessionCreated(HttpSessionEvent se){
        HttpSession session = se.getSession();
        ServletContext servletContext = session.getServletContext();
        AtomicInteger userCounter = (AtomicInteger) servletContext.getAttribute("userCounter");
        int userCount = userCounter.incrementAndGet();
        System.out.println("userCount incremented to: " + userCount);
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se){
        HttpSession session = se.getSession();
        ServletContext servletContext = session.getServletContext();
        AtomicInteger userCounter = (AtomicInteger) servletContext.getAttribute("userCounter");
        int userCount = userCounter.decrementAndGet();
        System.out.println("---------- userCount decremented to :"
                + userCount);
    }
}


<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri ="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Country List</title>
</head>
<body>
We operate in these countries:
<ul>
    <c:forEach items="${countries}" var = "country">
        <li>${country.value}</li>
    </c:forEach>
</ul>


</body>
</html>



这里使用annotation WebListener进行listener声明,当然也可以在web.xml进行简单声明。

对于对session 相应attribute进行监听的情形,见下例
这是一个将不同表单用户名 绑定到一个容器上 并将用户名作为session绑定
对象的attribute的实例 定义的函数对于 attribute的创建及销毁进行监听
并进行有关个数的记录

package pub;

/**
 * Created by admin on 2017/2/21.
 */

import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
import java.util.Vector;
import java.util.Date;

public class OnlineUser implements HttpSessionBindingListener {
    public OnlineUser(){

    }

    private Vector users = new Vector();

    public int getCount(){
        users.trimToSize();;
        return  users.capacity();
    }

    public boolean existUser(String userName){
        users.trimToSize();
        boolean existUser = false;
        for(int i = 0;i < users.capacity(); i++){
            if(userName.equals((String)users.get(i))){
                existUser = true;
                break;
            }
        }
        return existUser;
    }

    public boolean deleteUser(String userName){
        users.trimToSize();;
        if(existUser(userName)){
            int currentIndex = -1;
            for(int i = 0;i < users.capacity();i++){
                if(userName.equals((String)users.get(i))){
                    currentIndex = i;
                    break;
                }
            }
            if(currentIndex != -1){
                users.remove(currentIndex);
                users.trimToSize();
                return  true;
            }

        }
        return false;
    }

    public Vector getOnlineUser(){
        return users;
    }

    public void valueBound(HttpSessionBindingEvent e){
        users.trimToSize();
        System.out.println("请求 ::::::::::" + e.getName());
        if(!existUser(e.getName())){
            users.add(e.getName());
            System.out.print(e.getName() + " 登入到系统 " + new Date());
            System.out.println("   在线用户数为 :" + getCount());
        }
        else {
            System.out.println(e.getName() + " 已经存在");
        }
    }

    public void valueUnbound(HttpSessionBindingEvent e){
        users.trimToSize();
            String userName = e.getName();
            deleteUser(userName);
            System.out.println(userName + "  退出系统 " + new Date());
            System.out.println("    在线用户数为: " + getCount());

    }


}

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>测试HttpSessionBindingListener接口</title>
</head>
<body>

<form name = "login" method="post" action = "onLineUser.jsp">
    <input type = "text" name = "username">
    <input type = "submit" name = "submit" value = "登录"/>
</form>

</body>
</html>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.*,pub.*" %>
<jsp:useBean id = "onlineuser" class="pub.OnlineUser" scope="application"/>
<html>
<head>
    <title>搞定JSP在线人数</title>
</head>
<body>
<center>
    <h1>登录成功,欢迎您访问!</h1>
</center>

<% session = request.getSession(false); %>
<%
    String username = request.getParameter("username");
    if(onlineuser.existUser(username)){
        out.println("用户<font color = 'red'>" + username + "</font>已经登陆!");
    }else{
        session.setMaxInactiveInterval(600);
        session.setAttribute(username, onlineuser);
        out.println("欢迎新用户: <font color = 'red'>" + username + "</font>登录得到系统!");
    }
    out.println("<br/>当前在线用户人数:<font color = 'red'>" + onlineuser.getCount() + "</font></br>");
    Vector vt = onlineuser.getOnlineUser();
    Enumeration e = vt.elements();
    out.println("在线用户列表");
    out.println("<table border = 1>" +
            "<tr><td>用户名</td></tr>");

    while (e.hasMoreElements()){
        out.println("<tr><td>" + (String)e.nextElement() + "<br/>" + "</td></tr>");
    }

    out.println("</table>");
%>

<center>
    <p>elapsed制作</p>
</center>

<%
    out.println("<p><a href = 'logout.jsp?username=" + username + "'>退出系统</a></p>");
%>


</body>
</html>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="pub.OnlineUser,java.util.*" %>
<jsp:useBean id = "onlineuser" class = "pub.OnlineUser" scope="application"/>
<html>
<head>
    <title>搞定JSP在线人数</title>
</head>
<body>
<center>
    <h1>登录成功 欢迎您的访问</h1>
</center>

<%
        String username = request.getParameter("username");
        if(username!=null&&onlineuser.deleteUser(username)){
            out.println(username + " 已退出系统!");
            session.removeAttribute(username);
            out.println("<script>window.location = 'login.jsp'</script>");
        }
        else {
            out.println(username + " 已退出系统!");
            out.println("<script>window.location = 'login.jsp'</script>");
        }
%>

<center>
    <p>elapsed制作</p>
    <p><a href="logpout.jsp">退出系统</a></p>
</center>

</body>
</html>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值