我们在生活中,会看到很多类似监听器的东西:例如智能驾驶的汽车,识别到前方有障碍物时会自动提醒并绕行。智能电表识别到欠费后会自动断电等,其实在Java的世界里也有很多监听器,今天就来了解一下。
监听器
- Listener——>J2EE Servlet下的组件
- Listener的作用是对Web应用对象的监控
- 通过Listener监听自动触发指定的功能代码
Java被监控的应用对象有三种:
- servletContent:对全局属性对象
- HttpSession:对用户会话的属性监控
- ServletResponse:对请求及属性进行监控
过滤器与监听器的区别
过滤器的职责是对于URL进行拦截处理,是主动地
监听器是对于WEB对象进行监听,是被动触发的
实现一个监听器有以下三个必须的动作
- 实现Listener(对应)的接口
- 实现特定的方法
- 配置Listener(注解的话通过@WebListener)
下面给出一个实例代码:
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class MyFirstListener implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
System.out.println("监听到servlet被销毁");
}
@Override
public void contextInitialized(ServletContextEvent sce) {
// TODO Auto-generated method stub
System.out.println("监听到servlet被创建");
}
}
效果:
六种常用监听接口
内置对象监听接口
- ServletContextListener -> 监听ServletContext对象创建,销毁等操作
- HttpSessionListener -> 监听HttpSession对象创建,销毁等操作
- ServletRequestListener ->监听HttpServletRequest对象创建,销毁等操作
属性监听接口
- ServletContextAttributeListener ->监听全局属性操作
- HttpSessionAttributeListener -> 监听用户会话属性操作
- ServletRequestAttributeListener ->监听请求属性操作
下面给出一个内置对象监听的示例代码:
监听类:
package com.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener
public class Listener implements ServletContextListener,ServletRequestListener,HttpSessionListener{
@Override
public void sessionCreated(HttpSessionEvent se) {
// TODO Auto-generated method stub
HttpSession session =se.getSession();
System.out.println("session被创建,sessionId = "+session.getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// TODO Auto-generated method stub
HttpSession session =se.getSession();
System.out.println("session被销毁,sessionId = "+session.getId());
}
@Override
public void requestDestroyed(ServletRequestEvent sre) {
// TODO Auto-generated method stub
System.out.println("请求被销毁");
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
// TODO Auto-generated method stub
System.out.println("请求被初始化");
}
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
System.out.println("Context被销毁");
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
System.out.println("Context被初始化");
}
}
Servlet:
package com.listener;
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 TestListener
*/
@WebServlet("/TestListener")
public class TestListener extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public TestListener() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getServletContext().setAttribute("CONTEXT", "1");
request.getSession().setAttribute("SESSION", "2");
request.setAttribute("ATTRIBUTE", "3");
// TODO Auto-generated method stub
System.out.println("hello");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
效果:
通过监听器实现展示网页访问频率
监听器:
package com.wangwei;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.SimpleFormatter;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;
@WebListener
public class RequestTotalListener implements ServletContextListener,ServletRequestListener{
@Override
public void requestDestroyed(ServletRequestEvent sre) {
// TODO Auto-generated method stub
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
// TODO Auto-generated method stub
HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();
String URL = request.getRequestURL().toString();
if(URL.endsWith("/RequestListenerServlet")) {
return ;
}
List<String> timeList =(List<String>) sre.getServletContext().getAttribute("timeList");
List<Integer> countList =(List<Integer>) sre.getServletContext().getAttribute("countList");
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm");
String time =dateFormat.format(date);
if(timeList.indexOf(time)==-1) {
timeList.add(time);
countList.add(1);
sre.getServletContext().setAttribute("countList",countList);
sre.getServletContext().setAttribute("timeList",timeList);
}else {
int index = timeList.indexOf(time);
countList.set(index, countList.get(index)+1);
}
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
}
@Override
public void contextInitialized(ServletContextEvent sce) {
// TODO Auto-generated method stub
List<String> timeList =new ArrayList<>();
List<Integer> countList = new ArrayList<>();
sce.getServletContext().setAttribute("timeList", timeList);
sce.getServletContext().setAttribute("countList", countList);
}
}
Servlet:
package com.wangwei;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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 com.alibaba.fastjson.JSON;
/**
* Servlet implementation class RequestListenerServlet
*/
@WebServlet("/RequestListenerServlet")
public class RequestListenerServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public RequestListenerServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("asdffff");
List<String> timeList =(List<String>) request.getServletContext().getAttribute("timeList");
List<Integer> countList =(List<Integer>) request.getServletContext().getAttribute("countList");
Map result =new HashMap();
result.put("countList" , countList);
result.put("timeList" , timeList);
String json =JSON.toJSONString(result);
System.out.println(json);
response.getWriter().println(json);
}
}
html:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src ="js/echarts.min.js"></script>
<script type="text/javascript" src ="js/jquery-3.3.1.min.js" ></script>
</head>
<body>
<div id="main" style =width:600px;height:400px;">
<script type="text/javascript">
function showChart(){
$.ajax({
url:"/TotalCount/RequestListenerServlet",
type:"get",
dataType:"json",
success:function(json){
var myChart = echarts.init(document.getElementById('main'));
//绘制图表
myChart.setOption({
title: {
text: ' 请求流量分析统计'
},
tooltip: {},
xAxis: {
data: json.timeList
},
yAxis: {},
series: [
{
name: '访问量',
type: 'line',
data: json.countList
}
]
});
}
})
}
window.setInterval("showChart()",1000)
</script>
</div>
<script type="text/javascript">
</script>
</body>
</html>
效果: