首页> 中国专利> 改善客户端-小型服务程序通信的方法和系统

改善客户端-小型服务程序通信的方法和系统

摘要

本发明提供了一种用于改善万维网(Web)中客户端-小型服务程序通信的方法和系统,而不改变现有通信协议也不改变客户端。如果初始请求包括用于检索期望信息的所有信息,则现有技术中在客户端和小型服务程序之间的单向通信路径保持不变。但是,如果小型服务程序识别到在初始客户端网络浏览器请求中没有包括用于检索期望信息的缺失信息,则小型服务程序通过利用所述初始HTTP请求的HTTP响应功能,自动地打开另一通信路径以将缺失信息提供到小型服务程序,其中该另一通信路径由另一小型服务程序功能组件支持,并且特征为如下步骤:小型服务程序产生脚本,其中该脚本当在客户端网络浏览器处执行时检索缺失信息并调用该另一小型服务程序功能组件;将脚本添加到所述HTTP响应,从而指示其作为局部响应;发送包括脚本的HTTP响应到客户端网络浏览器;暂停小型服务程序对初始HTTP响应的执行,直到可得到缺失信息;另一小型服务程序功能组件接收缺失信息,其中缺失信息被包含在脚本当在客户端网络浏览器上执行期间所创建的新HTTP请求中;向小型服务程序提供缺失信息;并小型服务程序利用缺失信息继续执行初始HTTP响应,以检索所述HTTP响应的其余部分并提供HTTP响应的其余部分到客户端网络浏览器来显示。

著录项

  • 公开/公告号CN101258494A

    专利类型发明专利

  • 公开/公告日2008-09-03

    原文格式PDF

  • 申请/专利权人 国际商业机器公司;

    申请/专利号CN200680032557.7

  • 发明设计人 S·拉斯普尔;Y·塞尔莱特;

    申请日2006-07-26

  • 分类号

  • 代理机构中国国际贸易促进委员会专利商标事务所;

  • 代理人赵科

  • 地址 美国纽约

  • 入库时间 2023-12-17 20:45:19

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2010-10-27

    授权

    授权

  • 2008-10-29

    实质审查的生效

    实质审查的生效

  • 2008-09-03

    公开

    公开

说明书

技术领域

本申请一般涉及客户端-服务器通信,更具体而言,本发明涉及改善万维网(Web)中客户端-小型服务程序(servlet)通信,而不改变现有通信协议也不改变客户端,本发明尤其涉及提高这样的小型服务程序在小型服务程序识别到在初始客户端网络浏览器请求中没有包括的用于检索期望信息的缺失信息的情况下的灵活性和交互性。

背景技术

术语“客户端-服务器”指的是包括经由通信协议(例如,HTTP)互相通信的客户端和服务器的网络应用构架。

Web指的是一种信息空间,其中感兴趣的项(被称为资源)由被称为统一资源标识符(URI)的全局标识符来标识。Web包括3个标准:指定如何为每个信息页赋予能找到其的唯一“地址”的统一资源定位符(URL);指定客户端和服务器如何互相发送信息的超文本传输协议(HTTP);和超文本置标语言(HTML),一种使得信息能被显示在各种设备上的信息编码方法。

Web工作如下:当打开客户端的网络浏览器(例如,Microsoft的Internet Explorer,Apple的Safari)时,其代表客户端(或使用的计算机)利用超文本传输协议(HTTP)通信,并进行网页请求。一旦发送了请求,客户端的网络浏览器计算机就等待来自服务器的超文本数据流。当服务器获得该请求时,其搜索所请求的文件,并且在该文件存在的情况下,按照请求将其发送给客户端的网络浏览器。

小型服务程序指的是在服务器上运行的程序,其等待来自客户端的网络浏览器的请求,并产生对该请求的响应(例如,动态产生的网页)。

现有技术中的小型服务程序的工作方式如下:

客户端的网络浏览器通过调用其URL而发送HTTP请求到小型服务程序。客户端的网络浏览器不必知道其正在调用小型服务程序。调用小型服务程序就像加载任何其他网页一样,区别在于参数可以在请求中被传递到小型服务程序,并且服务器所发送回的响应不是静态文档、而是动态地产生的。

请求被对小型服务程序进行主机服务的应用服务器分析,并被传递到对应于所要求的URL的小型服务程序。

请求被小型服务程序分析,最终参数被解析和解释,并且动态地产生返回到客户端的网络浏览器的文档(文档内容可以取决于客户端网络浏览器在请求中所传递的最终参数)。

所产生的文档被客户端网络浏览器接收,并被显示或解释(如果其包含一些如JavaScript的可执行脚本)。

小型服务程序已经通过提供用于展示动态内容的强大且可缩放的框架转换了因特网:不是公布内容必须定期更新的静态文档,小型服务程序而是允许客户端网络浏览器附加参数到HTTP请求并基于其请求获得当前信息。如果没有小型服务程序,就不可能创建其中用户通过其客户端网络浏览器与服务器交互的交互式网络应用。

但是,小型服务程序具有一个限制,即在接收到请求之后,它们不能向客户端网络浏览器要求缺失的信息。

通过进入的请求,小型服务程序可以接收能够影响服务器上所采取的操作或服务器所返回的信息的参数的列表。例如,如果在因特网上订购物品,则按下“提交”按钮就将发送包含订购物品列表的请求到服务器。服务器将处理该列表(更新数据库等等),并通常产生列出所选择的所有物品的确认页面。

但是,对于传统的小型服务程序,对于在服务器上处理请求所必需的所有参数必须被包含在客户端网络服务器所发送的初始请求中:如果小型服务程序在处理请求期间发现在初始请求中客户端网络服务器没有提供某附加信息,则没有办法暂停处理,向客户端网络服务器要求缺失的信息,并从中断点恢复处理。这限制了小型服务程序的应用领域:

客户端网络浏览器必须精确地知道小型服务程序需要什么信息。

在其请求中,客户端网络服务器可能需要提供比小型服务程序实际需要的信息更多的信息。

传统的小型服务程序不能处理要求比客户端网络服务器所提供的信息更多的信息的意外情况。如果请求不包含所有必要信息,则处理该问题的传统方法是停止该处理,返回Web页面到客户端网络服务器,其中该Web网页替换原始网页并显示错误消息或者显示要求缺失信息并使用新信息调用相同或另一小型服务程序的新网页。

这并不是处理缺失信息的非常好的方法,因为在一个小型服务程序调用中停止请求处理并在另一小型服务程序调用中继续交易并不是简单的事情。此外,这可能使用户迷惑,因为经常再次显示相同的但具有小注释以通知用户缺失什么信息的页面,这从可用性的观点来看是有问题的。

发明内容

本发明的目的是提供一种在不改变现有通信协议且不改变客户端的情况下改善万维网(Web)中客户端-小型服务程序通信的方法和系统,更具体而言,本发明的目的是在小型服务程序识别到在初始客户端网络浏览器请求中没有包括的用于检索期望信息的缺失信息的情况下提高这样的小型服务程序的灵活性和交互性。

本发明提供了一种在不改变现有通信协议也不改变客户端的情况下改善客户端-小型服务程序通信的方法和系统。

如果初始请求包括用于检索期望信息的所有信息,则当前现有技术中在客户端和小型服务程序之间的单向通信路径保持不变。但是,如果小型服务程序识别到在初始客户端网络浏览器请求中没有包括的用于检索期望信息的缺失信息,则小型服务程序通过利用所述初始HTTP请求的HTTP响应功能,自动地打开另一通信路径以将缺失信息提供给小型服务程序,其中该另一通信路径由另一小型服务程序功能组件支持,并且特征为如下步骤:小型服务程序产生脚本,其中该脚本当在客户端网络浏览器处被执行时,检索缺失信息并调用该另一小型服务程序功能组件;将该脚本附加到所述HTTP响应,指示其作为部分响应;发送包括该脚本的HTTP响应到客户端网络浏览器;小型服务程序暂停初始HTTP响应的执行,直到该缺失信息可用;该另一小型服务程序功能组件接收所述缺失信息,其中该缺失信息被包含在脚本当在客户端网络浏览器上执行期间所创建的新HTTP请求中;向小型服务程序提供该缺失信息;以及通过小型服务程序利用缺失信息以检索所述HTTP响应的其余部分并提供HTTP响应的其余部分给客户端网络浏览器用于显示,继续执行初始HTTP响应。

小型服务程序具有现有技术中所描述的限制的原因源于HTTP协议和网络浏览器/服务器的设计方式:

HTTP是用于客户端网络浏览器和网络服务器之间通信的协议。

通常,HTTP协议允许客户端网络浏览器发送请求到网络服务器(或应用服务器/小型服务程序),以发送某信息到服务器(POST请求)或从服务器获得文档(GET请求)。

与客户端网络浏览器所发送的请求的类型(GET还是POST)无关地,服务器应当总是处理该请求,并返回包含含有返回码(例如指示请求是否能够被成功地处理)的首标以及最终结果文档的响应。当请求成功时,客户端网络浏览器通常利用来自服务器的响应显示服务器所返回的文档,从而替换包含产生请求的元素的链接的原始页面。

如果请求长期运行,则服务器也可以在完成整个文档产生之前定期地发送响应文档的部分。通过这种方法,用户可以阅读文档的开始部分,而不必等待产生并传送整个文档。

这是单向通信:协议仅仅预见了客户端网络浏览器发起的通信。服务器通常没有办法发送请求到客户端网络浏览器。

为了克服这一限制,本发明使用以下事实,即在产生整个响应文档之前,服务器可以发送“局部文档”到客户端网络浏览器;以及该局部文档可以包含在完全传送整个文档之前可以由客户端网络浏览器执行的JavaScript。JavaScript是能够被嵌入HTML页面中并且由客户端网络浏览器解释的语言。

通过本发明,提供了网络客户端和网络服务器之间的双向通信,其工作如下(参见图1):

客户端网络浏览器发送HTTP请求到应用服务器上的主小型服务程序。通过该请求,其能够提供小型服务程序处理该请求所需要某些初始参数;

主小型服务程序接收请求10,提取和解释最终参数并通过在服务器侧采取某些动作而开始处理该请求,从而产生响应文档20;

(到现在为止,这是现有技术的小型服务程序的工作方式)。

在处理请求期间,主小型服务程序发现某信息缺失,并且该信息必须由请求发起者提供30。该信息可以是用户必须输入的某些缺失数据、关于客户端网络浏览器本身或关于在处理请求期间在客户端网络浏览器上所显示的页面中某些其他元素的状态的某些系统信息。其必须是在需要或无需用户交互的情况下能够通过在客户端网络浏览器上执行JavaScript而检索的信息;

主小型服务程序暂停处理请求以及生成响应,并产生JavaScript40,该JavaScript 40当在客户端网络浏览器上运行时进行以下工作:

其检索(或向用户请求)缺失信息;

其调用次小型服务程序以传递附加检索的信息作为参数以及传递请求该信息的小型服务程序所产生的密钥;

主小型服务程序将在前一步骤中所产生的JavaScript附加到部分产生的响应文档,并发送该局部响应到客户端网络浏览器50;

主小型服务程序通过等待来暂停其执行,直到其在其之前已经产生的密钥之下能够找在网络会话中或在共享存储器中找到其所要求的信息60;

同时,客户端网络浏览器开始显示从主小型服务程序所接收的局部文档。如果一些内容已经产生,则其将被显示。嵌入在响应中的JavaScript被执行;

在执行嵌入在局部响应文档中的JavaScript期间,客户端网络浏览器检索主小型服务程序所要求的缺失信息,将该信息和密钥编码到次小型服务程序的URL中,并发送请求到该次URL。其中该信息应当在利用该密钥的情况下被存储;

重要的是注意到,该第二个请求的结果在对主小型服务程序的请求仍然在运行时不应该替换客户端网络浏览器所显示的当前文档以及中断第一个请求。这可以通过将第二请求的结果重新定向到单独帧或到页面的特定元素(图像,嵌入帧)、或者通过使用JavaScript API来程序地打开HTTP请求而被实现;

次小型服务程序接收请求62,在其参数中包含具有要存储在会话64(或与第一小型服务程序共享的存储器)中的信息的密钥/值对。然后,其返回成功码到客户端网络浏览器65。客户端网络浏览器可以忽略次小型服务程序的响应;

主小型服务程序在会话(共享存储器)中检测到已经为其已经产生的密钥存储了值。其提取该值(70;其是处理请求所缺失的信息),将该值从会话/共享存储器中移除,并重新开始处理请求。

处理继续,产生响应文档的其余部分。如果随后在处理请求期间发现更多信息缺失,则可以重复前面的步骤,以顺序地向用户要求更多信息80;和

最后,完成请求,并且客户端网络浏览器接收并显示完整响应文档80。

在本发明的一个优选实施例中,小型服务程序被实现为Java小型服务程序。但是,相同方法可以被用于CGI脚本或驻留在服务器上、并响应于HTTP请求提供动态内容的任何类似小型服务程序的程序。

在本发明的另一优选实施例中,脚本被实现为Java脚本。但是,返回到客户端网络浏览器以检索缺失信息的脚本(JavaScript)可以是能够被嵌入网络页面中并由客户端网络浏览器在正在处理期间(onthe fly)执行的任何语言(Java,Visual Basic等等)。

在本发明的再一优选实施例中,可以创建一般小型服务程序,其从用户接收非常低级别的信息(诸如鼠标或键事件),并对该信息进行复杂处理。客户端网络浏览器仅发送关于用户所产生的鼠标/键事件的信息,而不知道在发送请求时小型服务程序会做什么或其对于该信息是否将进行什么动作。小型服务程序解释该信息,并且当其判断在发生特定事件时必须采取动作时,其可以向客户端网络浏览器要求提供更多关于客户端网络浏览器侧上的事件或一些其他元素的信息,并且根据客户端网络浏览器所返回的信息动态处理该事件。

在本发明的另一进一步的实施例中,以复杂处理路径使用小型服务程序。初始请求包含足够的信息以开始处理。在处理期间,根据参数或服务器从后端系统(数据库等等)中所检索的数据,小型服务程序可以采取不同执行路径。如果在某点上用户必须决定处理应该如何继续,则小型服务程序可以要求客户端网络浏览器提示用户做出决定。该决定可以影响对该请求的进一步处理,而不中断该请求。处理可以在单个交易中运行。

在本发明的另一优选实施例中,附加地提供次小型服务程序。次小型服务程序接收JavaScript所发送的新HTTP请求,并且在当前HTTP会话对象中存储密钥值对。

在本发明的再一优选实施例中,代替使用次小型服务程序,JavaScript可以发送更新HTTP会话的请求到主小型服务程序。但是,在该情况中,主小型服务程序的第二实例会开始(平行于仍然正在产生对主请求的响应并等待缺失值的第一实例)。

在本发明的还一优选实施例中,HTTP协议可以由其他通信协议替代,该其他通信协议的特征在于所述客户端网络浏览器(3)发起请求以从所述小型服务程序(8)检索信息的单向通信路径,以及所述小型服务程序发送至少包含指示所述请求的成功或失败的返回码、并且在存在的情况下还包含所述请求的结果的响应。

附图说明

以下将参考附图以仅仅示例的方式详细地描述本发明的优选实施例:

图1显示了本发明的创新的双向通信路径;

图2A显示了实现创造性双向通信路径的一个优选实施例的客户端-服务器构架,和

图2B显示的时序图描述了给定实例中客户端网络浏览器、主小型服务程序和次小型服务程序之间的通信步骤。

图2A显示了客户端-服务器构架中本发明的一个优选实施例。

具体实施方式

本发明包括客户端1和服务器2侧。客户端1优选地是标准客户端网络浏览器3,其能够发送HTTP请求到网络服务器,并能够显示服务器所返回的HTML文档。客户端网络浏览器3应当能够执行嵌入要显示的文档13中的JavaScript 12。此外,其应当能够在已经传送整个文档3之前显示和执行嵌入服务器所返回的文档13的部分中的JavaScript 12。这是市场上可得到的所有现有客户端网络浏览器3的标准行为。

可选地,服务器返回并在客户端网络浏览器3上显示的文档13的格式不需要必须是HTML文档13。可以使用所有能够由客户端网络浏览器3显示并且能够包含在呈现期间被客户端网络浏览器3解释的脚本元素的文档类型。可以使用的文档的例子:XML,XHTML,SVG(可缩放矢量图形),XUL(XML用户接口语言)等等(尤其是所有类型的XML文档)。嵌入文档中的脚本12可以以除JavaScript之外的其他语言编写。客户端网络浏览器3中的JavaScript 12(或其标准化版本ECMA脚本)的支持是标准的。但是,可以使用能够被嵌入要由网络浏览器3呈现的文档13中的、以及能够在客户端网络浏览器3内执行以检索有关文档13中其他元素或有关客户端网络浏览器3或用户环境的信息的所有类型的脚本或插件程序。例子可以是:Visual Basic脚本,ActiveX组件、Java小程序(applet)、或本地客户端网络浏览器3插件程序。HTTP协议可以由其他通信协议代替,该其他通信协议的特征在于:所述客户端网络浏览器3发起请求以从所述小型服务程序8检索信息的单向通信路径,以及所述小型服务程序8发送至少包含指示所述请求成功或失败的返回码、并且在存在的情况下还包含所述请求的结果的响应。

服务器侧2优选为应用服务器4(例如,诸如WebSphere或Tomcat的J2EE服务器),其优选具有小型服务程序容件6。在本发明的优选实施例中,两个小型服务程序-主小型服务程序8和次小型服务程序10-被安装在该应用服务器4中。

应用服务器4不必是J2EE服务器。可以使用能够动态响应来自客户端网络浏览器3的HTTP请求的任何种类的服务器。可以被用于代替J2EE应用服务器的技术实例有:Microsoft.Net、或能够执行CGI脚本以显示动态内容的简单网络服务器。小型服务程序8、10和小型服务程序容件6可以由诸如ASP、PHP或CGI脚本这样的类似技术替代。

本发明在以其优选实施例实现时工作如下:(参见图2A的箭头):

在客户端侧1,客户端网络浏览器3发送请求到主小型服务程序(1)。主小型服务程序8是响应于初始请求执行对于产生要发送到客户端网络浏览器3的文档-页面13所必需的逻辑的小型服务程序。主小型服务程序8接收该请求,读取随着请求传递的最终参数,并开始产生文档13以将其返回到客户端网络浏览器3。随着请求传递的参数可以影响文档13的产生。本发明并不依赖于主小型服务程序8为了产生响应文档13而使用的逻辑。

在产生响应过程中的某些点处,主小型服务程序8需要客户端网络浏览器3在请求中还没有(作为参数)提供、但可以很容易地通过在客户端网络浏览器3中的客户端侧1上执行JavaScript 12而被检索的附加信息。

主小型服务程序8将JavaScript 12插入其已经开始产生的文档13中。在由客户端网络浏览器3执行时,该脚本12检索缺失信息,发送HTTP请求到次小型服务程序10,其中该请求包含主小型服务程序8所产生的密钥(密钥可以是随机产生的任何唯一字符串)以及在前一步骤中所检索的值作为参数。

一旦脚本12已经被产生并被插入局部响应中,主小型服务程序8就刷新其缓冲器,使得响应文档13的到此时为止已经产生的部分被立刻传送到客户端网络浏览器(2)。到网络浏览器3的通信信道不被关闭。被发送到客户端网络浏览器3的HTTP响应的首标指示响应使用“分块传输编码(chunked transfer coding)”,如HTTP 1.1中所定义的。该编码意味着响应不是在一个片块中到来的,而是在一系列块中到来的,并且客户端网络浏览器3应当等待新内容,直到服务器关闭连接。

一旦部分产生的文档13(包含文档起始部分和检索缺失信息的JavaScript 12的第一块)被传送到客户端网络浏览器3,在等待其余文档的同时,客户端网络浏览器3开始呈现到目前为止已经接收的文档13的部分,并执行被嵌入的脚本12。

该脚本12的执行检索缺失值,并发送另一HTTP请求到次小型服务程序10。该请求含有密钥和在前一步骤(3)中检索的值作为参数。

在第1个HTTP请求的响应正被加载期间发送附加HTTP请求到不同URL的能力对于网络浏览器3来说是通常的行为。如果没有该能力,则在完全加载整个文档之前,客户端网络浏览器3将例如不能显示包含在正被加载的长文档的开始部分中的图像。

次小型服务程序10接收JavaScript 12所发送的HTTP请求,解码在请求的参数中所包括的密钥和值,并将该密钥值对存储在当前HTTP会话对象中(4)。HTTP会话是存储有关一个客户端1与服务器2之间当前会话的信息的对象。每次接收到请求时,会话对象被传递到小型服务程序。如果相同客户端网络浏览器3发送HTTP请求到包含在相同小型服务程序容件6中和相同网络应用中的几个小型服务程序8,则相同会话对象将被传递到不同小型服务程序8。小型服务程序8可以在会话对象中读写值(该值被存储在密钥之下,该密钥随后可以被用来检索该值)。使用HTTP会话是在J2EE中在不同小型服务程序8之间传递值的普通方法。

不使用次小型服务程序10,JavaScript 12可以发送更新HTTP会话的请求到主小型服务程序8。但是在该情况下,主小型服务程序8的第二实例将开始(平行于仍然正在产生对于主请求的响应并等待缺失值的第1实例)。主小型服务程序8然后将需要测试何时接收请求,该请求是否正要求文档或者该请求是否提供处理文档请求(主请求)的小型服务程序的其他实例已经请求的附加信息。技术上,这通过测试随请求传递的参数来实现。如果特定参数被包含在请求中,则主小型服务程序8将知道其应当以包含在请求的其他参数中的密钥/值对来更新HTTP会话。在任何其他情况中,主小型服务程序8应当产生响应文档13。通过这样做,主小型服务程序8根据请求的参数将具有2个不同的逻辑。这与具有2个不同小型服务程序完全相同,每个小型服务程序执行单个逻辑。

次小型服务程序10不需要在HTTP会话中存储第2个请求(JavaScript所发送的请求)所传递的附加值以使主小型服务程序8知道。其他方法可以存储该值在小型服务程序容件6的Java虚拟机的系统属性中,或者使用其他共享存储器机制(根据应用服务器所使用的技术)。另一可能性是使次小型服务程序10存储该值在服务器的本地磁盘上的文件中,并且使主小型服务程序8读取相同文件。

一旦主小型服务程序8在共享存储器中(在HTTP会话中)发现所请求的值,主小型服务程序8就醒来,并继续产生文档13。使用缺失信息,文档现在能够被完全产生,并且文档的其余部分被传送到浏览器(5)-在最后步骤期间,主小型服务程序8已经定期地检查了HTTP会话的内容以查看值是否可得到。每次它检查会话并且值不可得到时,其休眠一小段时间,并且再次检查。

一旦小型服务程序关闭与网络浏览器3的连接(这在小型服务程序的doGet(...)或doPost(...)方法返回时自动执行),客户端网络浏览器就知道整个文档已经被下载了。

小型服务程序8可能需要来自客户端网络浏览器的不止一个附加信息以处理请求。可以通过在处理请求期间重复这里所述的步骤多次、或者通过产生一个在一个HTTP请求中检索和传送所有缺失信息到次小型服务程序10的JavaScript 12来实现多个缺失信息的检索。次小型服务程序10于是必须解码来自JavaScript所发送的辅助请求的多个密钥/值对,并相应地更新HTTP会话。

利用这种方法,在客户端网络浏览器3已经提交其初始请求之后,以及在处理请求期间,小型服务程序可以向客户端网络浏览器3请求附加信息。请求的处理不必像没有使用本发明那样被中止并重新从头开始。

客户端网络浏览器3中和应用服务器4中不需要修改。主小型服务程序8和次小型服务程序10分别是接收HTTP请求并返回单个响应到请求始发者的普通小型服务程序,如HTTP协议中所定义的那样。协议不被修改。客户端网络浏览器3和服务器2之间的所有通信由客户端网络浏览器驱动(如HTTP协议所预见的那样)。

仅仅这两个小型服务程序8、10之间的协作以及小型服务程序能够通过将其响应文档分块并将JavaScript命令嵌入其中来远程控制客户端网络浏览器3这一事实使服务器和客户端网络浏览器之间的双向通信成为可能。

以下,一个简单的实例显示本发明实际上如何工作(参见图2B)。

假设存在从客户端网络浏览器3接收请求并以取决于发送请求的客户端网络浏览器3的一些属性的方式产生一些内容的主小型服务程序8。进一步假设,主小型服务程序8需要知道发送请求的客户端网络浏览器窗口的宽度,并且该信息并没有包括在发送给主小型服务程序8的初始请求中。

客户端网络浏览器窗口的宽度是可以通过在客户端网络浏览器3中执行JavaScript表达“window.outerWidth”而很容易询问的属性。

该示例的主小型服务程序8和次小型服务程序10的源代码在本说明书最后的附录中。注意到,次小型服务程序独立于主小型服务程序的逻辑,并且可以由实现不同逻辑的几个“主”小型服务程序重新使用或共享。

重要的是注意到,该第2个请求的结果-在对于主小型服务程序的请求仍然在运行的同时-不应当替换客户端网络浏览器所显示的当前文档以及中断第1个请求。这可以通过将第二请求的结果重定向到单独帧或页面的特定元素(图像,嵌入帧)、或者通过使用JavaScript API来程序地打开HTTP请求来实现;

次小型服务程序10接收在其参数中包含具有要存储在会话(或与第1个小型服务程序共享的存储器)中的信息的密钥/值对的请求。然后,其返回成功码到网络浏览器3。网络浏览器3可以忽略次小型服务程序10的响应;

主小型服务程序8在会话(共享存储器)中检测到已经为其已经产生的密钥存储了值。其提取该值(该值是处理请求所缺失的信息),将其从会话/共享存储器中移除,并恢复处理该请求;

处理继续,响应文档的其余部分被产生。如果后来在处理请求期间发现有更多的信息缺失,则可以重复前几个步骤,以顺序地向用户要求更多信息。

最后,请求被完成,并且客户端网络浏览器3接收并显示完整响应文档。

图2B显示了根据本发明在该示例中在客户端网络浏览器和2个小型服务程序之间发生的行动和通信。

(1)客户端网络浏览器通过向服务器2发送HTTP GET命令(可选地:也可以使用POST命令)来发送初始请求到主小型服务程序8,从而请求主小型服务程序8的URL。该请求也可以包括在产生响应文档期间主小型服务程序8可能使用的附加参数。在该示例中,没有参数。

(2)主小型服务程序8通过写文档的开始部分直到需要缺失信息的点而开始产生响应文档(客户端网络浏览器的宽度)

<html>

<head>

</head>

<body>

在要求缺失值之前小型服务程序所产生的一些内容<p>,

在这点,为了写文档的其余部分,主小型服务程序8需要缺失信息。其产生在客户端网络浏览器已经将其发送到次主小型服务程序10之后将被用来在HTTP会话中存储和寻找缺失值的唯一密钥,并将JavaScript附加到所产生的内容,其中JavaScript在被客户端网络浏览器执行时将检索该值并将其与密钥一起发送到次小型服务程序10。

这里是脚本在本例中看起来象什么:第2行检索网络浏览器3窗口的宽度,随后的行使网络浏览器3打开HTTP请求到次小型服务程序10,从而将密钥(这里,密钥的随机值是key_112108)和检索值(这里被包含在变量“value”中)作为参数传递。

<script language=″JavaScript″>

var value=window.outerWidth;

var httpReq=new XMLHttpRequest();

httpReq.open(″GET″,″SecondaryServlet?key=key_112108&value=″+va

lue,true);

httpReq.send(null);

</script>

(3)通过刷新主小型服务程序8的缓冲器,局部文档(到目前为止所产生的内容以及检索缺失值的脚本)被发送给客户端网络浏览器3。当执行此时,应用服务器改变HTTP响应的编码为“分块”,这向客户端网络浏览器3表明内容将以几个分块片段被传输。图2显示了此时传输到客户端网络浏览器的文档的内容。

(4)主小型服务程序8暂停其执行,直到其在HTTP会话中发现在其已经在步骤(2)中产生的密钥下存储的值。技术上,其暂停其执行,并以规则的间隔检查该值是否可得到。一旦发现该值,其就恢复其执行。

(5)同时,客户端网络浏览器3已经接收到主小型服务程序8所发送的文档的第1个块。其显示到目前为止包含在文档中的可显示内容,并执行嵌入其中的JavaScript。注意,JavaScript根本不影响文档的内容。

(6)在执行JavaScript时,客户端网络浏览器3检索其窗口的宽度(这里是454个象素),并发送HTTP GET请求到次小型服务程序10。(替换地,也可以使用POST请求)。该请求包含之前产生的密钥(key_112108)和检索的值(454)作为参数。

GET SecondaryServlet?key=key_112108&value=454,

(7)次小型服务程序10接收该请求,从其参数中解码出密钥和值,并在HTTP会话中将值(454)放在密钥(key_112108)下面。然后,其立刻返回成功码(HTTP码200)(8),

(8)以规则间隔检查HTTP会话中存储在密钥“key_112108”之下的值的主小型服务程序8发现该值。其将该值从会话中移除,并利用其已经检索的值而恢复文档的产生。(在该示例中,值被简单地写入文本中。在更复杂的例子中,其可以被用来实现文档的更复杂的布局)。

文档的第2个分块部分被发送到客户端网络浏览器3:

完成页面的产生:宽度=454

</body>

</html>

(9)文档的第2个分块部分被发送到客户端网络浏览器,并且主小型服务程序8关闭与客户端网络浏览器3的通信信道,从而指示后面没有更多内容。

(10)客户端网络浏览器3显示文档的其余部分。

更详细的执行图解参见图1。

有关该示例的完整源代码,参见本说明书末尾处的附录。

     Appendix:

     Source 1:Main Servlet

     import java.io.*;

     import javax.Servlet.*;

     import javax.Servlet.http.*;

     public class MainServlet extends HttpServlet implements Servlet {

 /**

  *URL of the secondary Servlet storing the requested key/value pairs

  *in the HTTP session

  */

private final static String SECONDARY_SERVLET_URL=″SecondaryServlet″;

/**

*@see javax.Servlet.http.HttpServlet#void

  (javax.Servlet.http.HttpServletRequest,

  javax.Servlet.http.HttpServletResponse)

*/

public void doGet(HttpServletRequest req,HttpServletResponse resp)

  throws ServletException,IOException {

  resp.setContentType(″text/html;charset=ISO-8859-4″);

  HttpSession session=req.getSession();

  PrintWriter out=resp.getWriter();

  out.println(″<html>″);

  out.println(″<head>″);

  out.println(″</head>″);

  out.println(″<body>″);

  //Starts the generation of the response

  out.println(

    ″Some content produced by the Servlet cefore the missing value is asked<p>″};

  //(...)

  //at some point during the processing of the answer,

  //the Servlet nocices that some information are missing

    //Suspends the generation of the response.

    //Asks the client′s web-browser′s to retrieve the missing value and send it to

    //the server through the secondary Servlet

    //The 3rd parameter is the JavaScript expression retrieving

    //the value when executed in the browser.

    //In this example we ask the client′s web-browser for the width of the

    browser window

    Object value =requestValue(req,reap,″window.outerWidth;″);

    //When this method returns,the local variable ″value″contains the

    requested value

    //Continue the generation of the response

    //(...)

    out.println(″Finish the generation of the page:Width=″+value);

    out.println (″</body>″);

    out.println (″</html>″);

}

/**

 *Generates a unique key that can be used to store the missing value in

  the Web session

 */

private String generateKey(){

  return ″key_″+System.currentTimeMillis();

}

/**

 *Requests the client′s web-browser to provide the Servlet a missing value.

 *This methods generates and transmit a JavaScript to be interpreted

 *by the client′s web-browser.This JavaScript retrieves the missing value

 *by executing a JavaScript expression given as parameter,

 *and sends a request to the secondary Servlet that will store

 *the retrieved value in the HTTP session,to that it is accessible

 *for the main Servlet.

 *Note that this method will block and suspend the main Servlet,until

 *the missing value has been returned by the client′s web-browser.

 * 

 *@param req The main HTTP request sent by the client′s web-browser to this main

   Servlet

 *@param resp The HTTP response used by this Servlet to respond to the request

 *@param JavaScriptExpression The JavaScript expression,which when executed

 *in the client′s web-browser,returns the missing information needed by this Servle

 *@return The missing value returned by the client′s web-browser.

 */

private Object requestValue(

  HttpServletRequest req,

  HttpServletResponse resp,

  String JavaScriptExpression)

  throws IOException {

  PrintWriter out =resp.getWriter();

  HttpSession session =req.getSession();

  //Generates a unique key,that will be used to store/retrieve the

  //missing value in the current HTTP session

  String key =generateKey();

  //Starts the generation of a JavaScript that will retrieve

  //the information from the client′s web-browser

  out.println(″<script language=\″JavaScript\″>″);

  //In this example the client′s web-browser will prompt the user to enter

  the missing value

  out.println(″var value =″+JavaScriptExpression +″;″);

  //once the value has been retrieved on stored on the client side

  //in a JavaScript variable,transmit this value to the server through

  //the secondary Servlet

  //Makes the client′s web-browser open an HTTP request to the secondary Servlet,

  //pesslng the key and value of the missing information

  out.println(″var httpReq =new XMLHttpRequest();″);

  out.println (

    ″httpReq.open(\″GET\″,\ ″″

       +SECONDARY_SERVLET_URL

       +″?key=″

       +key

       +″&value=\″+value,true);″);

   out.println (″httpReq.send(null);″);

out .printin(″</script>″);

//Flushes the buffer of the Servlet,so that the JavaScript retrieving the

//missing value is transmitted and executed immediately by the client′s

web-browser

resp.flushBuffer();

//Suspends the execution of the main Servlet until a value can be found

//in the HTTP session under the key defined previously

Object value =session.getAttribute(key);

while (value ==null){

  try {

    Thread.sleep(100);

  }catch(InterruptedException e){

   e.printStackTrace();

  }

  value =session.getAttribute(key);

}

//Now that the value has been extracted,remove its key/value pair from

//the session,to avoid memory leaks and allow the same key to be reused

//several times

session.removeAttribute(key);

return value;

  }

}

Source 2:Secondary servlet

   import java.io.*;

   import javax.servlet.*;

   import javax.servlet.http.*;

   /**

    * Secondary Servlet opdating the HTTP session with key/value pairs.

    * The key/value pairs to store are contained in the incoming requests

    * under the keys ″key″and ″value″.

    * For example a request containing the parameters

    * ″mySecondaryServletURL?key=myKey&value=myValue″

    * will store the value ″myValue″under the key ″myKey″in the HTTP session.

    */

   public class SecondaryServlet extends HttpServlet implements Servlet {

    /**

    *@see javax.servlet.http.HttpServlet#void

    (javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)

    */

    public void doGet(HttpServletRequest req,HttpServletResponse resp)

         throws ServletException,IOException (

         //Extracts from the request coming from the browser the key/value pair

         //to store in the HTTP session

         String key =req.getParameter(″key″);

         String value =req.getParameter(″value″);

         if (key !=null){

               //Store this key/value pair in the HTTP session

               req.getSession().setAttribute(key,value);

               }

     }

}

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号