写在线及时通讯时,记录在线成员遇到的问题,使用监听器解决。

首先在服务器启动时,进行初始化servletContext,并且将在线用户的HashSet<User>存入其中。

接着,监听session的创建和销毁,在创建时,将其加入HashSet<User>中,销毁时,进行移除!

具体实现:

package com.chat.listen;

import java.util.HashSet;
import java.util.Set;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

import com.chat.bean.User;

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

    /**
     * Default constructor. 
     */
    public MyListen() {
        // 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 context = arg0.getServletContext();
    	Set<User> onlineUsers = new HashSet<User>();
		context.setAttribute("onlineUsers", onlineUsers);
System.out.println("init service");
    }
	
}

package com.chat.listen;

import java.util.Set;

import javax.servlet.ServletContext;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import com.chat.bean.User;

/**
 * Application Lifecycle Listener implementation class MySessionListen
 *
 */
@WebListener
public class MySessionListen implements HttpSessionListener,HttpSessionAttributeListener {

	private ServletContext context = null;
	
    @SuppressWarnings("unchecked")
	@Override
	public void attributeAdded(HttpSessionBindingEvent event) {
		// TODO Auto-generated method stub
    	HttpSession session = event.getSession();
    	User user = (User)session.getAttribute("user");
    	ServletContext context = session.getServletContext();
		Set<User> onlineUsers = (Set<User>)context.getAttribute("onlineUsers");
    	onlineUsers.add(user);
System.out.println("####################################");
System.out.println(user.getUserName());
    	context.setAttribute("onlineUsers", onlineUsers);
    	Set<User> temp = (Set<User>)context.getAttribute("onlineUsers");
System.out.println(temp.size());
System.out.println("####################################");
	}

	@Override
	public void attributeRemoved(HttpSessionBindingEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void attributeReplaced(HttpSessionBindingEvent arg0) {
		// TODO Auto-generated method stub
		
	}

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

	/**
     * @see HttpSessionListener#sessionCreated(HttpSessionEvent)
     */
	public void sessionCreated(HttpSessionEvent event)  { 
         // TODO Auto-generated method stub
    	
    	if(context == null) {
    		HttpSession session = event.getSession();
    		context = session.getServletContext();
    	}
System.out.println(" a session had been create");
    }

	/**
     * @see HttpSessionListener#sessionDestroyed(HttpSessionEvent)
     */
    public void sessionDestroyed(HttpSessionEvent event)  { 
         // TODO Auto-generated method stub
    	HttpSession session = event.getSession();
    	User user = (User)session.getAttribute("user");
    	ServletContext context = session.getServletContext();
    	@SuppressWarnings("unchecked")
		Set<User> onlineUsers = (Set<User>)context.getAttribute("onlineUsers");
    	onlineUsers.remove(user);
System.out.println(" a session had been delete");
    }
}

具体在jsp页面中如何展示就不罗列了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在学习Vue监听器、生命周期、组件通信和路由的过程中,我也遇到了一些问题。以下是我遇到的一些问题以及解决方法: 1. 监听器无法正常工作:有候我发现我的监听器无法正确地追踪数据的变化。这可能是因为我没有正确地定义监听器或者没有在正确的地方使用它们。解决方法是仔细检查监听器的定义和使用位置,并确保它们被正确地绑定到Vue实例上。 2. 生命周期钩子函数执行顺序:理解Vue的生命周期钩子函数执行顺序可能会有一些困惑。有候我会在不同的钩子函数中执行相同的操作,但由于执行顺序不同,结果可能出乎意料。解决方法是仔细研究Vue官方文档中有关生命周期钩子函数执行顺序的说明,并根据需要调整代码逻辑。 3. 组件通信方式选择:在处理组件通信,有候我会犹豫选择props还是自定义事件。这取决于数据流的方向以及组件之间的关系。解决方法是仔细考虑数据流的需求,并根据情况选择合适的通信方式。如果是父组件向子组件传递数据,可以使用props;如果是子组件向父组件通知事件,可以使用自定义事件。 4. 路由配置错误:在配置Vue路由,我有遇到路由无法正确匹配或者导航到指定页面的问题。这可能是因为我没有正确地定义路由规则或者导航链接的路径有误。解决方法是仔细检查路由配置和导航链接,并确保它们的路径是正确的。 5. 路由导航守卫问题:在使用路由导航守卫,我可能会遇到一些逻辑上的困惑。例如,在`beforeEach`导航守卫中如何正确地处理异步操作或者如何根据条件进行路由拦截。解决方法是仔细研究Vue官方文档中关于导航守卫的说明,并根据需要使用合适的钩子函数和逻辑来处理路由拦截和操作。 总的来说,对于遇到问题,我会仔细研究Vue官方文档和相关资料,并利用搜索引擎寻找解决方案。另外,参与Vue社区和论坛也是获取帮助和解决问题的好途径。不断学习和实践是掌握Vue监听器、生命周期、组件通信和路由的关键。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值