目录结构
├── src\
│ └── com\
│ └── zhang\
│ ├── listener\
│ │ ├── MyListener.java
│ │ └── MyListener2.java
│ └── servlet\
│ └── ListenerServlet.java
└── web\
├── WEB-INF\
│ └── web.xml
├── index.jsp
└── main.jsp
技术栈
- 后端 :Java Servlet + 监听器(Listener)
- 前端 :JSP(JavaServer Pages)
- 通过监听器实现应用启动/销毁时的资源管理
- 通过Servlet处理HTTP请求
- 使用JSP实现动态页面渲染
后端代码
package com.zhang.listener;
import javax.servlet.*;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import java.util.Date;
/**
* 监听器
* 监听作用域对象的创建和销毁以及属性的相关配置,可以添加一些属性配置,做逻辑判断
*
* 主要监听三种作用域
* ServletContext(application) session request
*
* request
* 接口:
* ServletRequestListener:监听request对象的创建和销毁
* public void requestDestroyed(ServletRequestEvent servletRequestEvent) request对象销毁时添加的逻辑代码
* public void requestInitialized(ServletRequestEvent servletRequestEvent) request对象创建时添加的逻辑代码
* ServletRequestAttributeListener:监听request作用域属性的添加,删除和更改
* public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) 属性添加时要做的事情
* public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) 属性删除时要做的事情
* public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) 属性更改时要做的事情
* ServletContext:
* 接口:ServletContextListener 监听servletContext对象的创建和销毁
* public void contextInitialized(ServletContextEvent servletContextEvent)创建对象,当启动tomcat服务器的时候创建
* public void contextDestroyed(ServletContextEvent servletContextEvent)销毁对象,当关闭tomcat服务器的时候销毁
* ServletContext:
* 接口: ServletContextListener: 监听servletContext对象的属性的添加和删除和更改
* public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent)添加属性
* public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent)删除属性
* public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent)修改属性
* session:
* 接口: HttpSessionListener 监听session对象的创建和销毁
* public void sessionCreated(HttpSessionEvent httpSessionEvent)session对象创建的时候执行
* public void sessionDestroyed(HttpSessionEvent httpSessionEvent)session对象销毁的时候执行
* 接口:HttpSessionAttributeListener 监听session对象的属性的添加和删除和更改
* public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) 添加属性
* public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) 删除属性
* public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) 修改属性
*属性的参数不同
*/
public class MyListener implements ServletRequestListener, ServletRequestAttributeListener, ServletContextListener,ServletContextAttributeListener, HttpSessionListener, HttpSessionAttributeListener {
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
System.out.println("request对象被销毁"+new Date());
}
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
System.out.println("request对象被创建"+new Date());
}
@Override
public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("项目request作用域添加数据");
System.out.println(servletRequestAttributeEvent.getName());
System.out.println(servletRequestAttributeEvent.getValue());
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("项目request作用域删除数据");
System.out.println(servletRequestAttributeEvent.getName());
System.out.println(servletRequestAttributeEvent.getValue());
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("项目request作用域属性替换");
System.out.println(servletRequestAttributeEvent.getName());
System.out.println(servletRequestAttributeEvent.getValue());
}
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("servletContext创建");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("servletContext销毁");
}
@Override
public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("ServletContext添加属性");
System.out.println(servletContextAttributeEvent.getName());
System.out.println(servletContextAttributeEvent.getValue());
}
@Override
public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("ServletContext删除属性");
System.out.println(servletContextAttributeEvent.getName());
System.out.println(servletContextAttributeEvent.getValue());
}
@Override
public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("ServletContext修改属性");
System.out.println(servletContextAttributeEvent.getName());
System.out.println(servletContextAttributeEvent.getValue());
}
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
System.out.println("session对象被创建");
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
System.out.println("session对象被销毁");
}
@Override
public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("session添加属性");
System.out.println(httpSessionBindingEvent.getName());
System.out.println(httpSessionBindingEvent.getValue());
}
@Override
public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("session删除属性");
System.out.println(httpSessionBindingEvent.getName());
System.out.println(httpSessionBindingEvent.getValue());
}
@Override
public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("session修改属性");
System.out.println(httpSessionBindingEvent.getName());
System.out.println(httpSessionBindingEvent.getValue());
}
}
package com.zhang.listener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
* 监听访问次数
*/
public class MyListener2 implements HttpSessionListener, ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
//获取application
ServletContext sc = servletContextEvent.getServletContext();
//设置网站在线人数的初始值
sc.setAttribute("count",0);
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("servletContext被销毁");
}
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
//获取application
ServletContext sc = httpSessionEvent.getSession().getServletContext();
int count = (int)sc.getAttribute("count");
sc.setAttribute("count",++count);
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
//获取application
ServletContext sc = httpSessionEvent.getSession().getServletContext();
int count = (int)sc.getAttribute("count");
sc.setAttribute("count",--count);
}
}
package com.zhang.servlet;
import javax.servlet.ServletContext;
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 = "ListenerServlet")
public class ListenerServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置编码格式
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
System.out.println("ListenerServlet逻辑处理");
// request.setAttribute("listener","listener");
// request.removeAttribute("listener");
//向servletContext中添加属性
// ServletContext sc = this.getServletContext();
// sc.setAttribute("servletContext","servletContext--value");
//向session作用域中添加属性
HttpSession session = request.getSession();
session.setAttribute("session","session--value");
session.invalidate();//session默认三十分钟失效
response.getWriter().write("listener study");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
web
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>ListenerServlet</servlet-name>
<servlet-class>com.zhang.servlet.ListenerServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ListenerServlet</servlet-name>
<url-pattern>/listener</url-pattern>
</servlet-mapping>
<listener>
<listener-class>com.zhang.listener.MyListener</listener-class>
</listener>
<listener>
<listener-class>com.zhang.listener.MyListener2</listener-class>
</listener>
</web-app>
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
$END$
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>main</title>
</head>
<body>
当前在线的人数是:${applicationScope.count}
</body>
</html>
用到的jar
jsp-api.jar
servlet-api.jar