我所了解的b/s架构是这样一种模式:当用户发起请求时,web服务器会接受并处理这个请求,好像只有当用户发起请求时,服务器才会有所动作。可不可以实现这样一种功能:当ServletContextAttributeListener监听到某个用户改变了ServletContext的某个属性时,web服务器会自动给另一个用户通知。不知道我描述的是否清楚?请大家帮帮忙

解决方案 »

  1.   

    如果web服务器不能自动给另一个用户通知,那么另一个用户该怎样得知ServletContext某个属性的改变呢?
      

  2.   

    第一个问题
    可以通过JavaScript的onload()方法来自动加载一些需要的内容
    还可以通过DWR来进行异步请求 
    第二个问题 这个问题当然不用你来操心~服务器自动来管理 因为ServletContext是个application只要服务器不关 他就会自动知道哦
      

  3.   

    我所了解的b/s架构是这样一种模式:
    当用户发起请求时,web服务器会接受并处理这个请求,好像只有当用户发起请求时,服务器才会有所动作。
    基本正确,对于用户请求,肯定是这样,只有发起请求,后台才动作。
    但,web server也可以有很多线程自动运行,跟用户请求无关,比如:定时更新缓存、定时生成静态页面、定时生成报表。
    可不可以实现这样一种功能:当ServletContextAttributeListener监听到某个用户改变了ServletContext的某个属性时,
    web服务器会自动给另一个用户通知。
    目前的WEB架构,由后台通知前台,这是不可能实现的。
    因为HTTP协议决定了客户和服务器之间是没有长连接的,服务器根本不知道用户还在不在,所以通知也无从发起。
    用户只能在发起下一次请求时,获知这种变化,目前AJAX的应用,使得页面能够以更快的周期去后台探测是否有变化,
    但本质上,还是前台轮询后台,而非后台通知前台。
      

  4.   

    说法是对的,但是这种功能很久以前就实现,具代表性的应用就是google talk
      

  5.   

    首先,B/S它是基于http协议来工作的,就是请求,响应模式也就是发送请求(request)-->接收请求--->处理请求--->返回结果(response),
    http是一个无状态协议,(会话是用过session来实现的,它本身不是http的一部分)就是响应完,它们就没有任何连接了;
    那如果,要S一直知道B的这边的改变,那只能让B不断的请求!
    那最简单的方式就是使用JavaScript让页面每隔一段时间就自动发送一次请求!
      

  6.   

    当ServletContext改变的时候主动发送给一个用户,是可以实现的。但是这样推的方式需要用户与服务器保持长连接,而在b/s结构中,长连接是很耗资源的。而且有很多的障碍因素。比如最大连接数的限制,并发的限制。所以最好借助与其他方式来实现,例如:定时请求(js定时器+ajax)查询属性是否更改,更改属性后借助与内存或数据库来保存更改状态或值。这样,没5分钟请求一次判断就可以了。
      

  7.   

    例如代码:
    response.setCharacterEncoding("UTF-8");  
    response.setContentType("text/html");  
    PrintWriter pr = response.getWriter();  
               
    try {  
        while(true) {  
            pr.print("输出信息");  
            pr.flush();  
            Thread.sleep(60000);  
        }
    } catch(Exception e) {  
        e.printStackTrace();  
    }
      

  8.   

    在客户端和服务器端建立一个socket长连接。
    不过会有很大消耗。