Listener monitora estatísticas de usuários online
1. Introdução
Quando você começou a trabalhar em projetos Java Web, após dominar o Servlet, pode não ter uma boa compreensão da função de Listener e da escrita de código. Este artigo através da realização de estatísticas de usuário online e prática de código de lista de usuário online, para que todos possam entender e usar o Listener por meio de operações reais.
2. Cenário de negócios
Você deseja exibir um número online de pessoas no projeto sem saber como começar? ? ?
Quer ver a lista de usuários atualmente logados em sua plataforma? ? ?
Este artigo o implementa para você por meio de JSP + Servlet + Listener, dê uma olhada em 5 minutos.
3. Exibição de efeito
Abra um navegador diferente para fazer login. Você pode ver o número de pessoas atualmente logadas e a lista de usuários.
Quando o usuário faz logoff, o usuário atual é desconectado. E veja o número de usuários online -1, e a lista de usuários também reduz esse usuário.
4. Implementação do código
4.1 Estrutura do projeto
4.2 preparação da página
4.2.1 Página inicial (index.jsp)
index.jsp é usado para exibir o usuário atualmente conectado (o usuário existe na Sessão), bem como exibir o número de usuários conectados e a lista de usuários conectados. Existem também saltos de página login.jsp e register.jsp. Como os dados do usuário conectado são armazenados no domínio do aplicativo, eles precisam ser registrados em index.jsp antes de efetuar login. Você pode ver a lista de login do usuário.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<html>
<head>
<title>主页</title>
</head>
<body>
<h1>welcome to index.jsp!</h1>
<c:if test="${session_user!=null}">
欢迎您,${
session_user.userName}
<a href="loginOut">退出</a>
<a href="">用户列表</a>
</c:if>
<c:if test="${session_user==null}">
<a href="login.jsp">登录</a>
<a href="register.jsp">注册</a>
</c:if>
<a href="index.jsp">主页</a>
<span style="color: red">${
tip}</span>
<hr/>
<h3>在线用户</h3>
当前在线用户人数:[${
fn:length(onlineUser)}]人
<br/>
用户列表:<br/>
<c:forEach items="${onlineUser}" var="user" varStatus="u">
第[${
u.index+1}]位,在线[${
user}]用户。<br/>
</c:forEach>
</body>
</html>
4.2.2 Página de login (login.jsp)
PS: Antes de efetuar login, registre os usuários em register.jsp. Não há conexão de banco de dados aqui e os dados são armazenados no cache. Portanto, você precisa se registrar antes de fazer o login.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>登录页面</h1>
<form action="login.do" method="post">
用户:<input type="text" name="username">
<br/>
密码:<input type="password" name="pwd"/>
<br/>
<input type="submit" value="登录" />
</form>
<span style="color: red">${
tip}</span>
</body>
</html>
4.2.3 Página de registro (register.jsp)
PS: Após o sucesso do registro, os dados serão armazenados no domínio do aplicativo. Quando o usuário efetua login, a entrada do usuário é comparada com os dados no domínio do aplicativo. Se o usuário existir, o login será bem-sucedido.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>注册页面</h1>
<form action="register.do" method="post">
用户:<input type="text" name="username">
<br/>
密码:<input type="password" name="pwd"/>
<br/>
性别:<input type="radio" name="sex" value="1"/>男
<input type="radio" name="sex" value="0"/>女
<br/>
<input type="submit" value="注册" />
</form>
</body>
</html>
4.2 Preparação do controlador
4.2.1 Controlador que lida com o login
@WebServlet(name = "LoginServlet", urlPatterns = "/login.do")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String pwd = request.getParameter("pwd");
//先从缓存中拿出users
ServletContext sc = request.getServletContext();
List<User> users = (List<User>) sc.getAttribute("users");
for (User u : users) {
if(u.getUserName().equals(username)&&u.getPwd().equals(pwd)){
//跳转到index.jsp
HttpSession session = request.getSession();
session.setAttribute("session_user",u);
request.getRequestDispatcher("index.jsp").forward(request,response);
}
}
//提示用户名密码不正确
request.setAttribute("tip","用户名密码不正确!");
request.getRequestDispatcher("login.jsp").forward(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
4.2.2 Controlador que lida com a saída
@WebServlet(name = "LoginOutServlet",urlPatterns = "/loginOut")
public class LoginOutServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
session.removeAttribute("session_user");
request.setAttribute("tip","退出成功!");
request.getRequestDispatcher("index.jsp").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
4.2.3 Controlador com função de registro
@WebServlet(name = "RegisterServlet",urlPatterns = "/register.do")
public class RegisterServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接收参数
String username = request.getParameter("username");
String pwd = request.getParameter("pwd");
String sex = request.getParameter("sex");
User user = new User(username,pwd,Integer.parseInt(sex));
//把注册用户存储起来
ServletContext sc = request.getServletContext();
List<User> users = (List<User>) sc.getAttribute("users");
//把user存到缓存中(application)
users.add(user);
sc.setAttribute("users",users);
request.setAttribute("tip","注册成功!请登录");
request.getRequestDispatcher("login.jsp").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
4.3 Preparação do ouvinte
No ouvinte, Guagua escreveu muitos comentários. Conciso e fácil de entender, você pode lê-lo com confiança.
/**
*在线用户监听器
*/
@WebListener()
public class OnLineListener implements ServletContextListener,
HttpSessionListener, HttpSessionAttributeListener {
//创建一个application变量
ServletContext application = null;
// Public constructor is required by servlet spec
public OnLineListener() {
}
//监听服务器启动的method
public void contextInitialized(ServletContextEvent sce) {
System.out.println("------------服务器启动了---------------");
//创建一个List<user>,并把该list存到application中
List<User> users = new ArrayList<>();
application = sce.getServletContext();
//创建一个onlineUser来存在线用户
List<String> onlineUser = new ArrayList<>();
application.setAttribute("users",users);
application.setAttribute("onlineUser",onlineUser);
}
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("--------------服务器关闭了----------------");
}
// HttpSessionListener implementation
//session是基于服务器端创建的。当一个浏览器访问服务器就会创建一个唯一session
public void sessionCreated(HttpSessionEvent se) {
System.out.println("-----session被创建了-----------");
/**
* 可以统计当前有多少人连接我们的服务器。(统计在线访问人数)
*/
}
public void sessionDestroyed(HttpSessionEvent se) {
/* Session is destroyed. */
System.out.println("--------session被销毁了------------");
/**
* 可以统计当前有多少人连接我们的服务器。(统计在线访问人数)
*/
}
/*
attributeAdded()方法:监听session执行setAttr()时触发
统计登录到该系统的用户
*/
public void attributeAdded(HttpSessionBindingEvent sbe) {
System.out.println("-----session设值----"+sbe.getName()+","+sbe.getValue());
User user = (User) sbe.getValue();
//创建一个list来记录在线用户
HttpSession session = sbe.getSession();
application = session.getServletContext();
//先从缓存application域中拿到 onlineUser
List<String> onlineUser = (List<String>) application.getAttribute("onlineUser");
if(onlineUser.indexOf(user.getUserName())==-1){
//新增加的userName在onlineUser中不存在
onlineUser.add(user.getUserName());
//存储到application中
application.setAttribute("onlineUser",onlineUser);
}
}
/**
* attributeRemoved方法:监听session.removeAttr(key,val)
* 当用户退出时,则注销,并且更新在线用户数量与列表
*/
public void attributeRemoved(HttpSessionBindingEvent sbe) {
System.out.println("-----session销毁----"+sbe.getName()+","+sbe.getValue());
//创建一个list来记录在线用户
HttpSession session = sbe.getSession();
application = session.getServletContext();
User user = (User) sbe.getValue();
//先从缓存application域中拿到 onlineUser
List<String> onlineUser = (List<String>) application.getAttribute("onlineUser");
onlineUser.remove(user.getUserName());
application.setAttribute("onlineUser",onlineUser);
}
public void attributeReplaced(HttpSessionBindingEvent sbe) {
}
}
5. Resumo dos pontos de conhecimento
5.1 O ouvinte nos permite compreender melhor os 4 escopos
O ouvinte pode monitorar a criação e destruição da Sessão; ele também pode monitorar a criação e destruição do domínio do aplicativo; ele também pode monitorar os métodos setAttribute (chave, val) e removeAttribute (chave, val) do domínio da Sessão. Tudo isso exige que tenhamos um certo entendimento e conhecimento dos 4 escopos para usar melhor o Listener no desenvolvimento. ( A diferença entre os 4 escopos ainda não é? Apresse-se e clique em mim )
5.2 Ouvir outras extensões
5.2.1 Obter taxa de cliques do site
sessionCreated(HttpSessionEvent se){
}
sessionDestroyed(HttpSessionEvent se){
}
Ao abrir um navegador para acessar o projeto 127.0.0.1:8080/nome do projeto, o método sessionCreated () {} será executado. Quando o navegador é fechado, sessionDestroyed () {} será executado. Portanto, podemos atingir um número de visitantes ou função de taxa de cliques por meio desses dois métodos.
5.2.2 Log do servidor
contextInitialized(ServletContextEvent sce){
}
contextDestroyed(ServletContextEvent sce){
}
Esses dois métodos são usados para monitorar o domínio do aplicativo.Neste blog, Guagua também usa esses dois métodos para criar uma lista de pessoas que fazem login online. Esses dois métodos monitoram o ciclo de vida de todo o contêiner da web e podemos expandir muitas funções.
6. Anexe o código-fonte completo
Download do código-fonte: https://download.csdn.net/download/u010312671/12562328