版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/qq_38720976/article/details/84474950
JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。
在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为ServletContext,HttpSession和ServletRequest这三个域对象Servlet规范针对这三个对象上的操作,又把多种类型的监听器划分为三种类型:
1)ServletContext监听
ServletContextListener:用于对Servlet整个上下文进行监听(创建、销毁)。
ServletContextAttributeListener:对Servlet上下文属性的监听(增删改属性)。
2)Session监听
HttpSessionListener接口:对Session的整体状态的监听。
HttpSessionAttributeListener接口:对Session的属性监听。
3)Request监听
ServletRequestListener:用于对Request请求进行监听(创建、销毁)。
ServletRequestAttributeListener:对Request的属性的监听(增删改属性)。
示例:用监听器统计网站在线人数
原理:每当有一个访问连接到服务器时,服务器就会创建一个session来管理会话。那么我们就可以通过统计session的数量来获得当前在线人数。 所以这里用到的是HttpSessionBindingListener。
特别提醒:由于浏览器会保存一段时间session数据,所以我们最好多使用几个浏览器测试在线人数效果。
一.监听器
1:创建监听器类HttpSessionBindTest
package com.iflytek.xxsystem.listener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
@WebListener
public class HttpSessionBindTest implements HttpSessionBindingListener {
private int count;//记录session的数量
public int getCount() {
return count;
}
public HttpSessionBindTest() {
}
//监听session的创建
public void valueBound(HttpSessionBindingEvent sce) {
//登录
System.out.println("登录 value Bound");
count++;
}
//监听session的撤销
public void valueUnbound(HttpSessionBindingEvent sce) {
//退出
System.out.println("退出 value Unbound");
count--;
}
}
2.上下文属性监听类ServletContextListenerTest
package com.iflytek.xxsystem.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class ServletContextListenerTest implements ServletContextListener {
public ServletContextListenerTest() {
// TODO Auto-generated constructor stub
}
@Override
public void contextInitialized(ServletContextEvent sce) {
//设置application的count属性
HttpSessionBindTest sessionbinder = new HttpSessionBindTest();
sce.getServletContext().setAttribute("counter",sessionbinder);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
}
}
二.servlet处理数据
1.登陆及监听数据处理
package com.aiit.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class doBusinessServlet
*/
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public LoginServlet() {
super();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String user=request.getParameter("user");
String pwd = request.getParameter("pwd");
//设置session过期时间1分钟
//request.getSession().setMaxInactiveInterval(10);
if(user.equals(pwd)) {
request.getSession().setAttribute("user", user);
//找到唯一的bindlisten对象
Object counter = request.getServletContext().getAttribute("counter");
//把listener设置成session
request.getSession().setAttribute("usercount", counter);
request.getRequestDispatcher("main.jsp").forward(request, response);
}else {
response.sendRedirect("Login.jsp");
}
}
}
2.退出销毁对象处理
package com.aiit.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/TuichuServlet")
public class TuichuServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public TuichuServlet() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//销毁session
request.getSession().invalidate();
response.sendRedirect("Login.jsp");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
三、前台JSP
1.登陆界面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
员工登录界面
登录到HR系统
2.主界面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
欢迎${user}登录
在线人数${applicationScope.counter.count}
退出登录
效果展示: