采用Server Push技术实现界面的实时同步更新

界面同步更新需求¶

  • 在多用户协作中,用户的操作界面应能够实时反映应用系统的业务状态,也就是其他用户操作结果应能够实时、自动反映到当前用户的操作界面中。

例如:当前的用户界面中显示用户的列表信息,另一个用户正在维护用户列表信息,当前用户界面中的用户列表信息应能够自动显示另一用户修改后的用户列表,当前用户不需要重新打开业务界面,也不需要进行界面刷新操作,就能够实时更新界面中的数据。

  • 在界面中实时显示后台不断变化的业务数据,而不需要客户端定时刷新。

例如:实现一个显示服务器CPU负载的界面,该界面不需要通过刷新,就能够显示不断变化的服务器CPU负载情况。

服务器推送技术¶

  • 在Web应用中,客户端通过向服务器发送请求,获取最新的业务状态,如果需要实时显示最新的业务状态,就需要通过轮询,客户端不断的发出请求。
  • 服务器推送技术,是服务器端把变化的业务数据,发送到指定范围内的客户端,客户端并不需要通过轮询来更新界面。
  • 另外,客户端采用局部更新技术,在接收到服务器推送的内容后,只更新界面中的相关内容,而不是刷新整个页面。
  • 采用服务器推送技术和页面局部更新技术,可以获得非常好的用户体验效果,可以实现传统Web技术无法实现的应用功能。

多用户界面同步更新的技术原理¶

  • 采用Server Push技术。
  • 要实现在多个Session之间共享信息,实现这些共享信息的同步显示更新,需要通过Application scope的托管Bean来保存这些信息。
  • 要实现在一个session中的多个浏览器tab页中同步共享数据,可以使用Session scope的托管bean来保存这些信息。
  • 在服务器端,当这些信息发生改变时,采用Server Push技术,向所有注册的客户端Session发送变化的信息。
  • 服 务器端向那些客户端推送数据。每个Web客户端连接到应用系统后,都会建立一个Session,服务器向客户端推送数据,实际上是向客户端的 session推送数据。因此,客户端要想接收到服务器端推送的数据,就需要将自己的session加入到指定的组播域,服务器采用组播的方式,向该组的 所有session推送数据。通过以下API将当前session加入到组播域中: SessionRenderer.addCurrentSession(“all”);其中:all是组播域的名称,该名称可以任意指定,但是要和后面 提到的服务器端推送的组播域要对应。
  • 服务器端在什么时候向客户端推送数据。当服务器端的数据发生变 化后,需要通知客户端更新界面显示时,通过服务器端推送技术向指定组播域中的所有客户端发送更新的数据。使用以下API推送数据: SessionRenderer.render(“all”);其中:all是指定的组播域,凡是将自己的session加入到该域的所有客户端都将收 到推送的数据。

界面同步更新的配置与开发过程¶

  • Web.xml中的配置

com.icesoft.faces.concurrentDOMViews
true 在浏览器的多个tab页中是否同步界面更新


com.icesoft.faces.debugDOMUpdate
false 是否在控制台中显示服务器推送数据时的报文日志


com.sun.faces.validateXml
false 是否要求jsf的参考实现验证faces-config.xml中的xml合法性


com.sun.faces.verifyObjects
false是否要求jsf的参考实现验证所有应用程序对象是否正确创建


com.icesoft.faces.uploadMaxFileSize
4048576 文件上载的最大限制


javax.faces.STATE_SAVING_METHOD
server 在服务器端保存组件状态,也可以设置成client


com.sun.faces.enableRestoreView11Compatibility
true


com.icesoft.faces.synchronousUpdate
false 是否采用同步更新,同步更新是由客户端发起的更新,异步更新是由服务器端发起的更新,采用ajax push技术更新,这里必须设置为false


javax.faces.DEFAULT_SUFFIX
.jspx


com.icesoft.faces.standardRequestScope
true


com.icesoft.faces.blockUIOnSubmit
true 阻止界面的连续提交,忙状态指示器


  • 开发用于保存界面数据的托管bean。在JSF应用中,采用Managed bean保存UI组件中的数据,以及实现UI组件的事件处理方法。
  • 托管bean的作用域:application、session、request、view、none。
  • 要实现多用户的不同界面共享信息,并同步更新,需要采用application scope。
  • Managed bean的配置,在faces-config.xml中:
    
pushBean 在view中引用的名称
PushBean 类名
application bean的作用域

  • 实现managed bean:
public class PushBean {
private String hello;
public PushBean() {
SessionRenderer.addCurrentSession(“all”); 在创建该bean时,把当前session加入到组播域
}
public String getHello() {
return hello;
}
public void setHello(String hello) {
this.hello = hello;
SessionRenderer.render(“all”); 数据更新时,向组播域中所有客户端发送变化的数据
}
public String add(){
SessionRenderer.addCurrentSession(“all”); 执行此操作时,将当前的session加入组播域
return null;
}
}

  • 在view中:
                   







你可能感兴趣的:(采用Server Push技术实现界面的实时同步更新)