使用tomcat通过监听session达到监听访问服务器浏览器个数的目的

使用tomcat通过监听session达到监听访问服务器浏览器个数的目的,第1张

这两天在学习jsp,老师布置了一个监听器作业,做完了顺便发一下博客 要求:点击前端登录超链接,服务器统计当前人数且生成一个“退出超链接”返回至浏览器前端,此时点击“退出超链接”,服务器会将当前服务器在线人数减一并返回值浏览器客户端; 前端页面
DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title heretitle>
head>
<body>
<a href="login">点击登录a>

body>
html>

前端按钮点击事件
	
import java.io.IOException;
import java.io.PrintWriter;

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;

/**
 * Servlet implementation class login
 */
@WebServlet("/login")
public class login extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public login() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
	HttpSession session=request.getSession();//获取请求方(浏览器)session
	request.getServletContext().getAttribute("num");//获取请求方的num属性
	response.setContentType("text/html;charset=utf-8");//设置响应浏览器的编码方式为utf-8
	Integer num=(Integer)request.getSession().getServletContext().getAttribute("num");
	System.out.println("login被调用,num="+num);
	response.getWriter().println("当前人数为:"+num);
	response.getWriter().println("点击退出!");//在前段打印的内容,同时点击标签跳转到loginout这个类
	}

}

创建一个容器属性
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

/**
 * Application Lifecycle Listener implementation class ServletContextlisten
 *
 */
@WebListener
public class ServletContextlisten implements ServletContextListener {

    /**
     * Default constructor. 
     */
    public ServletContextlisten() {
        // TODO Auto-generated constructor stub
    }

	/**
     * @see ServletContextListener#contextDestroyed(ServletContextEvent)
     */
    public void contextDestroyed(ServletContextEvent arg0)  { 
         // TODO Auto-generated method stub
    
    }

	/**
     * @see ServletContextListener#contextInitialized(ServletContextEvent)
     */
    public void contextInitialized(ServletContextEvent arg0)  { 
         // TODO Auto-generated method stub
    	//为这个东西添加一个人数属性,Servletcontext可以在web.xml里面创建新的属性,或更改属性
    	Integer num=0;//创建一个包装对象
    	arg0.getServletContext().setAttribute("num", num);//在xml里添加一个属性,以及属性值(属性值要是对象)所以才有的前面的包装对象
    	System.out.println("容器被创建"+num);
    }
	
}

监听session的创建
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * Application Lifecycle Listener implementation class HttpSessionListen
 *
 */
@WebListener
public class HttpSessionListen implements HttpSessionListener {

    /**
     * Default constructor. 
     */
    public HttpSessionListen() {
        // TODO Auto-generated constructor stub
    }

	/**
     * @see HttpSessionListener#sessionCreated(HttpSessionEvent)
     */
    public void sessionCreated(HttpSessionEvent arg0)  { 
    	// TODO Auto-generated method stub
    	//浏览器只要打开就会创建session
    	//只要session创建了这个监听器就会知道从而调用这个方法
    	Integer num=(Integer) arg0.getSession().getServletContext().getAttribute("num");
    	System.out.println("session被创建"+num);
    	//获取在全局监听器中设置的sum的值
    	//session创建以后
    	num++;
    	arg0.getSession().getServletContext().setAttribute("num", num);
    	System.out.println("session被创建修改"+num);
    	//改完之后重新设置一下servletcontext的属性值
    	//创建就结束了
    	//这里的sum值会被退出的loginout这个方法通过给servletcontext.getattbute()调用,并输出
    }

	/**
     * @see HttpSessionListener#sessionDestroyed(HttpSessionEvent)
     */
    public void sessionDestroyed(HttpSessionEvent arg0)  { 
         // TODO Auto-generated method stub
    	//当访问端(浏览器)关闭之后,session会销毁,销毁之后就要人数减一;
    	Integer num=(Integer) arg0.getSession().getServletContext().getAttribute("num");
    	num--;
    	arg0.getSession().getServletContext().setAttribute("num",num);
    	System.out.println("session被删除修改"+num);
    	//这里的sum值会被退出的loginout这个方法给调用,并输出

    }
	
}

退出事件
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 loginout
 */
@WebServlet("/loginout")
public class loginout extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public loginout() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		request.getSession().invalidate();//干掉已存在的session,干掉sessi,监听器会听到,同时在监听器里对sum做 *** 作
		Integer num=(Integer)request.getSession().getServletContext().getAttribute("num");	//获取这个属性的值
		num--;
		System.out.println("loginout被执行"+num);//num是一个对象,因为,在这个类里面没有所以要定义一下
		response.setContentType("text/html;charset=utf-8");
		response.getWriter().print("你已退出,当前人数为:"+num);
	}

}

xml文件没有发,是因为每个人的路径啥的都不一样,上面的所有代码都把导包给删除了

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1296147.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存