来自RMI或者CORBA的服务器端回掉可以通知客户端服务器上有什么变化。但是如果客户端是浏览器,情况又如何呢?本文介绍pushlets来完成此功能。
下载:
http://www.pushlets.com ,当前下载版本为2.0.0
正文:
当前,开发者越来越将servlet或者jsp作为服务器前端语言了,但是同时,如果浏览器已经装载了当前html页面,它就很难从服务器端获取更新信息了。(如果客户端不主动请求的话)。
对于经验丰富的程序员,我们容易想起applet。本文我们要讨论一下到底如何做最好。
1, server-to-web client 通知:现有解决方案
在进入pushlet概念之前,让我们回顾一下现有的server-to-web client方案,可以归结为:HTML刷新、server-side callback以及messaging。
HTML refresh
<META HTTP-EQUIV="Refresh" CONTENT="4;URL=http://www.justobjects.nl">
页面会定时刷新,但是多少时间合适?
Server-side callback
在server-side callback中,server对象回调一个java-applet,通过RMI或者CORBA。通常,客户端首先传递一个RMI远程引用或者CORBA对象给server,server保存这些引用并按照顺序通知客户端,在javaworld的另外一篇文章中对此有详细的讨论(http://www.javaworld.com/javaworld/javaqa/1999-04/05-rmicallback.html)。
Messaging
消息方式的话,applet是messageing server的客户端,它通过TCP/IP连接或者UDP发送消息,最新进展甚至可以通过multicast。你可以通过消息中间件,如SoftWired的iBus,IBM的MQSeries,BEA的消息中间件等。JMS是消息的重要标准。
上述方案都有各自的优点和缺点。让我们看看Pushlet吧。
Pushlet是一个轻量级的客户端方案,不需要applet或者插件,直接和脚本以及HTML整合,使用标准HTTP连接,可以在任何servlet服务器中部署。它并一定是上述方案的替代,是你另外一个可选的方案。
Pushlet 基础
HTTP streaming
Pushlet基于HTTP streaming,它不是读取完html页面就关闭HTTP连接,连接仍然开放。
我们可以开发一个JSP或者servlet,它持续发送HTML内容给客户端。如下:
<HTML> <HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1"> <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> </HEAD> <BODY BGCOLOR="blue" TEXT="white"> <% int i = 1;
try { while (true) { out.print("<h1>"+(i++)+"</h1>"); out.flush();
try { Thread.sleep(3000); } catch (InterruptedException e) { out.print("<h1>"+e+"</h1>"); } } } catch (Exception e) { out.print("<h1>"+e+"</h1>"); } %> </BODY> </HTML> |
下一个例子中,我们了结一下pushlet的机制。如何让页面3秒钟刷新一次?包含三个文件:push-js-stream.html,push-js-stram-pusher.jsp,push-js-stream-display.html。主页面是push-js-stream.html。
push-js-stram-pusher.jsp
<% /** Start a line of JavaScript with a function call to parent frame. */ String jsFunPre = "<script language=JavaScript >parent.push('";
/** End the line of JavaScript */ String jsFunPost = "')</script> ";
int i = 1; try {
// Every three seconds a line of JavaScript is pushed to the client while (true) {
// Push a line of JavaScript to the client out.print(jsFunPre+"Page "+(i++)+jsFunPost); out.flush();
// Sleep three secs try { Thread.sleep(3000); } catch (InterruptedException e) { // Let client display exception out.print(jsFunPre+"InterruptedException: "+e+jsFunPost); } } } catch (Exception e) { // Let client display exception out.print(jsFunPre+"Exception: "+e+jsFunPost); } %> |
Push-js-stram.html
<script LANGUAGE="JavaScript"> var pageStart="<HTML><HEAD></HEAD><BODY BGCOLOR=blue TEXT=white><H2>Server pushes: <P>"; var pageEnd="</H2></BODY></HTML>";
// Callback function with message from server. // This function is called from within the hidden JSP pushlet frame function push(content) {
// Refresh the display frame with the content received window.frames['displayFrame'].document.writeln(pageStart+content+pageEnd); window.frames['displayFrame'].document.close(); }
</script> </HEAD>
<FRAMESET BORDER=0 COLS="*,0"> <!-- frame to display the content pushed by the pushlet --> <FRAME SRC="push-js-stream-display.html" NAME="displayFrame" BORDER=0 SCROLLING=no>
<!-- Hidden frame with the pushlet that pushes lines of JavaScript--> <FRAME SRC="push-js-stream-pusher.jsp" NAME="pushletFrame" BORDER=0 SCROLLING=no> </FRAMESET> |
Push-js-display.html
<HTML> <BODY BGCOLOR=black TEXT=white> <H1>WAIT...</H1> </BODY> </HTML> |
运行一下上面的代码,它体现了pushlet的全部思想:在servlet或者jsp中将Javascript代码以流的形式传递给一个隐藏的frame。
Design of the Framework
Pushlet框架应用的基本模式是Publish-Subscribe模式,也称作Observer模式,有服务器端组件和客户端组件:
l 服务器端Java类(围绕pushlet.java),请看UML类图。
l 客户端可复用脚本(pushlet.js)和html(pushlet.html),用来接收DHTML客户端的事件。
(石头注:在2.0.0版本中,应该是lib目录下的js-pushlet-client.jsp和js-pushlet-net.html)
l 客户端java类(JavaPushletClient.java和JavaPushletClientListener.java)用来接收Java客户端的事件。
l 用来在DHTML layer中显示内容的layer.js、layer-grid.js、layer-region.js。
l 测试事件和例子应用(如EventGenerators.java和temperature.html)。
关键类是Pushlet这个servlet,Publisher类,Subscriber接口和Event类。客户端通过调用Pushlet servlet,客户端接收Event
相关推荐
DHTML 对象 DHTML 属性 DHTML 方法 DHTML 事件 DHTML 集合 HTML 参考 HTML 元素 HTML 字符集 样式表(CSS)参考 CSS 属性参考 CSS 长度单位参考 其他参考 命令标识符 缺省行为参考 htc 行为参考 可视化...
本压缩包提供了五个关键资源,涵盖了从基础到高级的多个方面:DHTML、JavaScript、Servlet、CSS以及W3C标准。下面将逐一详解这些知识点。 1. **DHTML(Dynamic HTML)**: DHTML是一种使网页具有动态效果的技术...
DHTML的核心在于不依赖服务器刷新整个页面,而是通过客户端的脚本语言对网页的部分内容进行改变,提供更丰富的用户体验。 1. **JavaScript**:JavaScript是DHTML的关键部分,它是一种轻量级的解释性编程语言,主要...
DHTML 手册通常会涵盖这些基础知识,以及更高级的话题,如框架库(如jQuery)、AJAX使用、响应式设计、跨浏览器兼容性等。通过深入学习和实践DHTML,开发者能够创建更加丰富、互动的网页应用,提升用户与网页的交互...
7. **兼容性问题**:由于DHTML涉及到多个技术,不同浏览器对这些技术的支持程度不同,因此在实际应用中需要考虑跨浏览器兼容性。 **DHTML的应用场景:** - 交互式表单:验证用户输入、实时显示错误信息。 - 导航...
8. **兼容性问题**:由于DHTML涉及的技术在不同的浏览器中有不同的实现,所以开发者需要考虑跨浏览器兼容性,确保在多种环境下都能正常工作。这通常需要使用像jQuery这样的库来简化工作。 9. **学习资源**:Dhtml...
5. **兼容性考虑**: DHTML的效果在不同的浏览器上可能表现不一,需要了解不同浏览器对DHTML的支持情况,并进行适当的兼容性优化。 **DHTML手册CHM文件** 这份DHTML手册以CHM(Compiled Help Manual)格式提供,它...
DHTML的核心在于能够实现在浏览器端进行页面元素的动态操作,无需向服务器发送额外请求。这意味着网页可以在下载后继续变化,而无需重新加载整个页面。具体来说,DHTML能够实现的功能包括但不限于: - 动态隐藏或...
7. **跨浏览器兼容性**:由于不同的浏览器对DHTML支持程度不同,手册会指导如何编写兼容各种浏览器的代码。 8. **实践案例**:通过实际例子来展示DHTML技术的应用,帮助读者更好地理解和应用理论知识。 **DHTML文档...
在ASP中,开发者可以使用各种编程语言,如VBScript或JScript,来编写网页逻辑,服务器处理这些脚本后返回结果给客户端浏览器。这种技术在20世纪90年代末和21世纪初广泛应用于网站开发。 **DHTML(Dynamic HTML)**...
6. **浏览器兼容性**:由于不同的浏览器对DHTML的支持程度不一,开发者需要考虑跨浏览器的兼容性问题,通常会使用像jQuery这样的库来简化这个过程。 7. **DHTML与Web应用**:随着Web2.0的发展,DHTML技术被广泛应用...
DHTML,全称为Dynamic HTML,是一种利用HTML、CSS(层叠样式表)和JavaScript等技术在浏览器端实现页面动态效果的技术集合。它使得网页能够具备交互性、响应性和动画效果,而无需刷新整个页面。DHTML是90年代末期...
通过深入学习DHTML和DHTMLX Suite,开发者可以创建出具有高度交互性和用户体验的现代Web应用,而不必依赖于特定的浏览器插件或框架。DHTML技术的发展也为后来的Ajax(Asynchronous JavaScript and XML)和现代前端...
8. **最佳实践**:最后,手册可能会给出一些编写高效、可维护的DHTML代码的最佳实践和建议,帮助开发者写出高质量的DHTML应用。 通过学习这本中文手册,开发者能够深入理解DHTML的默认行为,并能有效地在实际项目中...
这些文档集合为开发一个完整的J2EE应用程序提供了全面的参考资料,从界面设计(CSS和DHTML)、数据存储(MySQL)、后台逻辑(Hibernate)、服务器接口(Servlet)到客户端脚本(jQuery),形成了一条完整的开发链路...
10. **浏览器兼容性**:由于不同浏览器对DHTML的支持程度不一,开发者通常需要使用像jQuery这样的库来处理兼容性问题,确保代码在各种浏览器上都能正常运行。 了解并熟练掌握DHTML、JavaScript和相关库如Prototype....
7. **浏览器兼容性**:由于不同的浏览器可能对DHTML的支持程度不同,手册可能会介绍如何编写跨浏览器的代码。 8. **实例分析**:提供实际的DHTML代码示例,帮助读者理解并应用这些技术。 《DHTML手册》作为一份较...