具体实施方式
在一个实施例中,本发明包括响应于来自客户机应用程序的数据请求将数据传送给服务器部署的客户机应用程序、组件、进程等的服务器应用程序、组件、进程等,诸如图1所示。在服务器组件102上,用于响应数据请求(诸如数据请求103)的代码或例程被分成事件处理器(例如多个事件处理器104)等。在一个实施例中,事件处理器104被逻辑地组织到名空间中。特别地,本发明包括构建包含有关名空间和要执行的事件处理器、以及对该处理器的参数的信息的诸如数据请求103的请求。本发明还包括服务器102中的体系结构,该体系结构使得开发者能够实现将传送对数据请求的响应的请求处理器。
本发明的一个示例涉及分布式个人信息管理应用程序中的日历视图。日历视图示出了给定日期的预约列表。服务器102通过查询数据库以检索给定时间范围内的预约来刷新日历中的该视图。接着取决于每个预约的开始时间和持续时间于正确位置在客户机(例如客户机组件108)中画出检索到的预约。在先前的系统中,这样的刷新操作是由客户机组件108实现的,该客户机组件108查询数据以便使用对超文本传输协议(HTTP)的网络发布认证及版本控制(WebDAV)扩展以可扩展标记语言(XML)格式返回、使用可扩展模式定义(XSD)转换以从XML数据生成HTML、并将HTML呈现给用户。这种系统是复杂且难以维护的。
然而,在本发明中,日历刷新是通过客户机组件108发送格式化的数据请求(例如数据请求103)并接收定义日历数据的代码流(例如JavaScript)来实现的。日历数据部分地在服务器102中呈现。客户机组件108执行代码并使用脚本生成HTML标记。由于多数的日历数据和显示信息在服务器102上预先计算,因此降低了客户机组件108的负担。在本发明的另一示例中,服务器102通过返回已在服务器102中呈现的HTML来刷新PIM应用程序的邮件视图。本发明不限于以任何特定的格式返回数据。相反,本发明以客户机组件108指示的任何形式返回数据,这些形式诸如HTML、XML、文本、JavaScript有效载荷等。
再参考图1,示例性框图示出了服务器组件、进程等,诸如经由网络(例如因特网)与一个或多个客户机组件108、进程通信的服务器组件102,这些客户机组件诸如客户机组件#1到客户机组件#N。图1的系统包括一个或多个计算机可读介质,诸如存储区域106。存储区域106存储多个事件处理器104,它们各自具有与之相关联的名空间。多个事件处理器104的每一个还具有与之相关联的一个或多个参数。表示格式化数据请求103的数据结构也被存储在计算机可读介质中。在图1中,示出数据请求是从客户机组件108发送给服务器组件102的。表示数据请求103的数据结构包括存储表示名空间的名空间值的名空间字段。该数据结构还包括存储与存储在存储区域106中的多个事件处理器104之一相对应的事件处理器值的事件处理器字段,该存储区域106与名空间字段中的名空间值所表示的名空间相关联。数据结构还包括存储对应于与事件处理器相关联的参数的至少一个参数值的参数字段,所述事件处理器由事件处理器字段中的事件处理器值表示。
在图1的示例中,客户机组件108是第一进程,且服务器组件102是第二进程。第一进程是分布式客户机应用程序、或者是由第二进程用来提供服务器组件102的部分或所有功能的。例如,第一进程可以是服务器部署的客户机应用程序,诸如服务器部署的个人信息管理客户机,而服务器组件102可以是个人信息管理服务器。然而,本发明不限于第一进程和第二进程之间的客户机-服务器管理。例如,第一进程和第二进程之间的关系可以是对等关系。
在一个实施例中,第一进程被配置成用于从第二进程请求数据的计算机可执行指令。特别地,第一进程从用户或进程接收数据请求。例如,请求可包括检查最近接收的电子邮件的请求、更新日历显示的请求、或者任何其它数据请求。第一进程标识与接收到的请求相关联的名空间值,并根据接收到的请求和所标识的名空间值选择事件处理器值。选定的事件处理器对于来自用户的特定请求是特定的,并且是与所标识的名空间值相关联的多个事件处理器104中的一个。选定的事件处理器具有一个或多个参数。第一进程对选定的事件处理器的一个或多个参数确定参数值。使用来自所接收到的请求的数据来确定参数值。该参数值可以包括任何类型的数据,并且可以用第二进程可识别的任何格式表达(例如可扩展标记语言)。第一进程通过将所标识的名空间值存储在名空间字段中,将选定的事件处理器值存储到事件处理器字段中,并将所确定的参数值存储到参数字段中来填充表示数据请求103的数据结构。第一进程将填充后的数据结构(例如数据请求103)发送给第二进程。
在一个实施例中,填充后的数据结构包括一系列数据-值对。例如,名空间字段和名空间值是一名称-值对,事件处理器字段和事件处理器值是一名称-值对,参数字段和参数值是一名称-值对。
第二进程被配置成执行用于生成请求的数据并将其传送给第一进程的计算机可执行指令。在一个实施例中,第二进程从第一进程接收填充后的数据结构(例如数据请求103),并从存储在存储区域106中的多个事件处理器104选择一个事件处理器。选定的事件处理器对应于在接收到的数据请求103中指定的事件处理器。第二进程使用来自接收自第一进程的数据请求103的参数来执行选定的事件处理器,以生成结果数据。第二进程将生成的结果数据发送给第一进程。
在一个实施例中,第二进程通过查阅载有有关可用名空间、事件处理器(例如多个事件处理器104)和参数的信息的配置数据库来选择适当的事件处理器。例如,第二进程包括用于在从第一进程接收数据请求103之前构建配置数据库的注册组件。例如,多个事件处理器104可按照名空间在配置数据库中组织起来。
本发明包括用于存储多个事件处理器104的装置、用于执行第一进程的装置以及用于执行第二进程的装置。诸如数据结构、用户界面、应用程序、应用编程接口(API)、计算机可执行指令、固件等(诸如附图中所示)等硬件和软件构成了用于存储多个事件处理器104的装置,用于执行第一进程的装置以及用于执行第二进程的装置。
在一个实施例中,本发明使用带有POST(发送)或GET(取得)动词的HTTP请求来实现。请求包括如下信息:名空间(例如,URL查询串中示为参数“ns”)、事件名称(例如,URL查询串中示为参数“ev”)以及一个或多个请求参数。这些参数或者在POST请求的XML中,或者作为GET请求的名称-值对。
本发明的一示例性GET请求(例如数据请求103)如下。
URL:/mail/ev.owa?ns=CalendarView&ev=Refresh&d=11142004T00:00:00Z在该示例中,客户机(例如客户机组件108)请求服务器(例如服务器组件102)执行“CalendarView”(日历视图)名空间中的“Refresh”(刷新)处理器。客户机组件108传递名称为“d”并带有值11/14/200412am的类型为日期的参数。服务器组件102取决于实现返回该视图的标记或JavaScript有效载荷。
本发明的一示例性POST请求(例如数据请求103)如下。
URL:/mailserver/ev.owa?ns=Messaging&ev=SaveMessage
主体:
<params>
<subject>Test email</subject>
<to><item>userApageA.net</item><item>userBpageA.net</item><to
>
<body>Test something</body>
</params>
在该示例中,客户机组件108请求服务器组件102执行‘Messaging’(消息传送)名空间中的‘SaveMessage’(保存消息)事件处理器。事件参数是主题(字符串)、至(字符串数组)以及主体(字符串)。对该事件的响应是指示成功或出错的HTTP结果。在该情况下,无需返回标记。参数可以是XML形式,或者是服务器可理解的任何其他语言格式。
接着参考图2,示例性流程图示出了用于传递所请求数据的客户机和服务器进程的操作。图2的流程图反映了一种用于生成数据并将其从一个进程发送到另一进程的计算机实现方法。该方法包括:在202由诸如图1中的客户机组件108等第一进程从用户处接收数据请求,在204标识与接收到的请求相关联的名空间。该方法还包括:在206根据接收到的请求确定与所标识的名空间相关联的事件处理器,并且在208根据接收到的请求填充与所确定的事件处理器相关联的参数。该方法还包括在210使用所标识的名空间、确定的事件处理器以及填充后的参数创建格式化请求(例如图1中的数据请求103)。该方法在212将多创建的格式化请求从第一进程发送到第二进程(例如服务器组件102)。
本发明的方法包括在214由第二进程从第一进程接收格式化请求。该方法在215基于接收到的请求选择名空间。该方法还包括在216由第二进程根据接收到的格式化请求从存储在一个或多个计算机可读介质(例如图1中的存储区域106)中的多个事件处理器(例如图1中的多个事件处理器104)中选择一个事件处理器,。该方法在217解析和验证接收到的请求中的参数。该方法还包括在218执行选定的事件处理器以生成结果数据,并在220将生成的结果数据从第二进程发送到第一进程。在一个示例中,第一进程接收结果数据并将该数据显示给用户。
开发者或其他用户可以创建用户定义的名空间、事件处理器和/或参数。本发明的方法还包括由第一进程从用户处接收用户定义的名空间、与用户定义的名空间相关联的用户定义的事件处理器、和/或用户定义的事件处理器的用户定义参数。第一进程向第二进程注册接收到的用户定义名空间、用户定义事件处理器和/或用户定义参数。第二进程注册接收到的用户定义名空间、用户定义事件处理器以及用户定义参数,而无需改变第二进程的体系结构。即,实现第二进程的代码(例如服务器组件)无需因注册而改变。第二进程的体系结构以与第二进程访问其它名空间、事件处理器和参数值相同的方式来访问所注册的用户定义名空间、事件处理器或参数。
在一个实施例中,一个或多个计算机可读介质具有用于执行如图2所示的计算机实现方法的计算机可执行指令。
接着参考图3,示例性框图示出了服务器组件中的模块。这些模块在由服务器组件产生的请求线程302中调用。在一个实施例中,事件处理器是实现IHttpHandler接口的HTTP处理器。本发明调用该接口中的ProcessRequest方法,该方法使得处理器类能够运行处理请求的代码。HTTP处理器工厂是实现IhttpHandlerFactory接口的类。这种对象用于创建用于处理请求的HTTP处理器对象的实例。在图3的示例中,示出了称为EventHandlerFactory(事件处理器工厂)304的HTTP处理器工厂类。本发明(例如HTTP应用程序306)例示了该类的对象(例如EventHandlerBase(事件处理器基础)实例308)并调用IHttpHandlerFactory接口的“GetHandler”方法,该方法基于请求的名空间创建了合适的HTTP处理器类的实例(例如EventHandlerBase子类)。HTTP应用程序306和EventHandlerBase实例308访问HTTP环境314。
EventContext(事件环境)312对象是包含有关请求的信息(例如请求的名空间、事件名称以及参数)的数据结构。EventHandlerRegistry(事件处理器登记表)310是用作有关名空间和由应用程序实现的它们的事件处理器,以及所支持的定制数据结构以及枚举的信息的储存库的类。在应用程序启动时,应用程序使用该储存库310来注册EventHandlerBase。本发明扫描该类(例如使用反射)来确定名空间、名空间中的事件以及事件的参数。该信息被存储,并在以后处理请求和解析参数期间使用。
图3示出了根据本发明的执行请求的示例性流程。本发明接收根据本发明的数据请求,创建EvemHandlerFactory类的实例,并在所创建的实例上调用GetHandler。EventHandlerFactory的GetHandler实现查看查询串以找出名空间和事件名称,并且对EventHandlerRegistry 310搜索对应于查询串中名空间和事件名称的处理器类。如果本发明找到所请求的事件处理器,则本发明创建该事件处理器的实例。还创建EventContext 312。本发明调用事件处理器上的ProcessRequest。ProcessRequest使用对请求本身特定的解析器类来解析请求的参数(例如请求是GET动词还是POST动词)。解析类解析请求中的参数,并使用EventHandlerRegistry310来做任何类型的转换,并确保模式是正确的(例如确保设置了该处理器要求的所有参数)。此时,参数可以存储在环境的一集合中。本发明执行与事件处理器相关联的事件处理器代码(例如执行处理器类中的方法)。该代码访问环境中的参数,执行处理,并以请求实体指定的任何形式将响应写入到请求实体中。
接着参考图4,示例性框图示出了继承自EventHandlerBase(事件处理器基础)402的一组样本事件处理器类。EventHandlerBase 402实现IhttpHandler(Ihttp处理器)接口404。CalendarEventHandler(日历事件处理器)406、MessagingEventHandler(消息传送事件处理器)408以及MessageViewEvent Handler(消息查看事件处理器)410继承自EventHandlerBase 402。开发者或者其它用户可通过创建名空间、标识名空间中的事件以及定义事件的参数来创建定制事件处理器,诸如图4所示。用户定义的名空间、事件处理器和/或参数可以是用户选定的(例如现有名空间内的新事件处理器),或者是用户创建的(例如新名空间)。在一个实施例中,用户定义的事件处理器被实现为动态链接库。
开发者或其他用户可使用属性来定义名空间的模式,如下所示。
[EventNamespace(″Namespacel″)]
internal class TestEventHandler:EventHandlerBase
{
[Event(″Event1″)]
[EventParameter(″Param1″,typeof(string))]
[EventParametet(″Param2″,typeof(int))]
public void Event1()
{
string param1=
(string)Context.GetParamValue(″Param1″);
int param2=(int)Context.GetParamValue(″Param2″);
Writer.Write(“{0}+{1}={2}”,param1,param2,
param1+param2).
}
}
在该示例中,EventNamespace属性定义线缆上(over the wire)名空间的名称,Event属性定义线缆上事件的名称,EventParameter属性定义参数的名称、类型以及参数是否是可选的。为了使用处理器,处理器开发者编写继承自EventHandlerBase 402的类、将事件写为没有任何参数和返回空的方法、使用上述适当的属性定义模式、并且向服务器组件注册类。
本发明的数据结构使得开发者能够定义可作为参数使用的复杂类型。一示例性数据结构如下所示:
[EventStruct(″r″)]
internal class RecipientWellItem
{
[EventField(″dn″)]
public string DisplayName;
[EventField(″em″,true,“oofpageA.net”)]//true=可任选字段
public string Email;
[EveutField(″t″)]
public int Type;
internal RecipientWellItem()
{
DisplayName=″″;
Email=″″;
Type=0;
}
}
上述示例性数据结构被如下所示地编码。
<r dn=”displayname”em=”email address”t=”1”/>
当本发明的服务器组件接收到符合特定数据结构的请求时,本发明创建特定数据结构类的实例并用来自请求的数据填充它。
示例性操作环境
图5示出了计算机130形式的通用计算设备的一个示例。在本发明的一个实施例中,诸如计算机130等计算机适用于在本文中所示和所述的其他附图。计算机130具有一个或多个处理器或处理单元132以及系统存储器134。在所示实施例中,系统总线136将包括系统存储器134的各种系统组件耦合到处理器132。总线136代表几种总线结构类型中任一种的一个或多个,包括存储总线或存储控制器、外围总线、加速图形端口以及处理器或使用各种总线体系结构的任一种的局域总线。作为示例而非限制,这类体系结构包括工业标准体系架构(ISA)总线、微信道体系架构(MCA)总线、增强ISA(EISA)总线、视频电子标准协会(VESA)局域总线以及也称为Mezzanine总线的外围部件互连(PCI)总线。
计算机130通常至少包括某种形式的计算机可读介质。计算机可读介质可以是可由计算机130访问的任一可用介质,包括易失性和非易失性介质、可移动和不可移动介质。作为示例而非限制,计算机可读介质包括计算机存储介质和通信介质。计算机存储介质包括以用于储存诸如计算机可读指令、数据结构、程序模块或其它数据等信息的任一方法或技术实现的易失性和非易失性、可移动和不可移动介质。例如,计算机存储介质包括RAM、ROM、EEPROM、闪存或其它存储器技术、CD-ROM、数字多功能盘(DVD)或其它光盘存储、磁盒、磁带、磁盘存储或其它磁性存储设备、或可以用来储存所需信息并可由计算机130访问的任一其它介质。通信介质通常具体化为诸如载波或其它传输机制的已调制数据信号中的计算机可读指令、数据结构、程序模块或其它数据,并包括任一信息传送介质。本领域技术人员熟悉已调制数据信号,即以对信号中的信息进行编码的方式设置或改变其一个或多个特征的信号。诸如有线网络或直接接线连接的有线介质以及诸如声学、RF、红外的无线介质和其它无线介质是通信介质的示例。上述任何介质的组合也应当包括在计算机可读介质的范围之内。
系统存储器134包括以可移动和/或不可移动、易失性和/或非易失性存储器形式的计算机存储介质。在所示实施例中,系统存储器134包括只读存储器(ROM)138和随机存取存储器(RAM)140。包含如在启动时有助于在计算机130内的元件之间传输信息的基本例程的基本输入/输出系统142(BIOS)通常储存在ROM 138中。RAM 140通常包含处理单元1320立即可访问和/或者当前正在操作的数据和/或程序模块。作为示例而非限制,图5示出了操作系统144、应用程序146、其它程序模块148和程序数据150。
计算机130也可包括其它可移动/不可移动、易失性/非易失性计算机存储介质。例如,图5示出了对不可移动、非易失性磁性介质进行读写的硬盘驱动器154。图5也示出了对可移动、非易失性磁盘158进行读写的磁盘驱动器156以及对可移动、非易失性光盘162,如CD-ROM或其它光学介质进行读写的光盘驱动器160。可在示例性操作环境中使用的其它可移动/不可移动、易失性/非易失性计算机存储介质包括但不限于,磁带盒、闪存卡、数字多功能盘、数字录像带、固态RAM、固态ROM等等。硬盘驱动器154、磁盘驱动器156和光盘驱动器160通常通过诸如接口166等非易失性存储接口连接到系统总线136。
以上讨论的并在图5中示出的驱动器或其他大容量存储设备及其相关联的计算机存储介质向计算机130提供了计算机可读指令、数据结构、程序模块和其它数据的存储。例如,在图5中,硬盘驱动器154被视为储存操作系统170、应用程序172、其它程序模块174和程序数据176。注意,这些组件可以与操作系统144、应用程序146、其它程序模块148和程序数据150相同,也可以与它们不同。这里对操作系统170、应用程序172、其它程序模块174和程序数据176给予不同的标号是为了说明至少它们是不同的副本。
用户可通过输入设备或用户接口选择设备,诸如键盘180和定位设备182(通常指鼠标、跟踪球或触摸板)向计算机130输入命令和信息。其它输入设备(未示出)可包括话筒、操纵杆、游戏垫、圆盘式卫星天线、扫描仪等等。这些和其它输入设备通过耦合至系统总线136的用户输入接口184连接至处理单元132,但是也可以通过其它接口和总线结构连接,如并行端口、游戏端口或通用串行总线(USB)。监视器188或其它类型的显示设备也通过接口,诸如视频接口190连接至系统总线136。除监视器188之外,计算机通常包括其它外围输出设备(未示出),诸如打印机和扬声器,它们可通过输出外围接口(未示出)连接。
计算机130可使用到一个或多个远程计算机,诸如远程计算机194的逻辑连接在网络化环境中操作。远程计算机194可以是个人计算机、服务器、路由器、网络PC、对等设备或其它公共网络节点,并通常包括许多或所有相关于计算机130所描述的元件。图5描述的逻辑连接包括局域网(LAN)196和广域网(WAN)198,但也可包括其它网络。LAN 136和/或WAN 138可以是有线网络、无线网络及其组合等。这类网络化环境常见于办公室、企业范围计算机网络、内联网以及全球计算机网络(诸如因特网)。
当在局域网络化环境中使用时,计算机130通过网络接口或适配器186连接至LAN 196。当在广域网络化环境中使用时,计算机130通常包括调制解调器178或用于通过诸如因特网的WAN 198建立通信的其它装置。可以是内置或外置的调制解调器178通过用户输入接口184或其他适当的机制连接至系统总线136。在网络化环境中,相关于计算机130所描述的程序模块或其部分可储存在远程存储器存储设备中(未示出)。作为示例而非限制,图5将远程应用程序192示为驻留在存储器设备上。所示出的网络连接是示例性的,也可以使用在计算机之间建立通信链路的其它手段。
一般而言,计算机130的数据处理器是通过在不同时间存储在计算机的各种计算机可读存储介质中的指令进行编程的。程序和操作系统通常分布在例如软盘或CD-ROM上。从那里它们被安装或载入到计算机的辅助存储器。在执行时,它们至少部分地被载入到计算机的主电子存储器中。当这种介质包含用于实现以下结合微处理器或其他数据处理器描述的步骤的指令或程序时,本文中所描述的本发明包括这些和其他各种类型的计算机可读存储介质。当根据本文所描述的方法和技术编程时,本发明还包括计算机本身。
为了说明起见,本文将诸如操作系统等程序和其他可执行程序组件示为分立的块。然而应该认识到这些程序和组件在不同时间驻留在计算机的不同存储组件中,并且由计算机的数据处理器执行。
尽管结合了包括计算机130的示例性计算系统环境进行描述,但是本发明可使用各种其他通用或专用计算系统环境或配置操作。计算系统环境并非旨在提出对本发明的使用范围或功能的任何限制。此外,计算系统环境不应被解释为对示例性操作环境中所示组件中的任一个或其组合具有任何依赖或要求。适用于本发明的公知的计算系统、环境和/或配置的示例包括但不限于个人计算机、服务器计算机、手持或膝上型设备、多处理器系统、基于微处理器的系统、机顶盒、可编程消费电子产品、移动电话、网络PC、微型计算机、大型计算机以及包括任何以上系统或类似设备的分布式计算环境。
本发明可在计算机可执行指令的一般环境中描述,这些计算机可执行指令诸如由一个或多个计算机或其他设备执行的程序模块。通常,程序模块包括但不限于执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等。本发明还可在分布式计算环境中实践,其中在分布式计算环境中任务由通过一通信网络链接的远程处理设备执行。在分布式计算环境中,程序模块可位于包含存储器设备的本地和远程计算机存储介质中。
软件体系结构环境中的接口包括软件模块、组件、代码部分或其他计算机可执行指令序列。接口包括例如第一模块访问第二模块以代表第一模块执行计算任务。在一个示例中,第一和第二模块包括诸如由操作系统所提供的应用编程接口(API)、组件对象模型(COM)接口(例如用于端对端应用程序通信)、以及可扩展标记语言元数据交换格式(XMI)接口(例如用于web服务之间的通信)。
接口可以是牢固耦合的同步实现,诸如在Java 2平台企业版(J2EE)、COM或分布式COM(DCOM)示例中。或者或此外,接口可以是松散耦合的异步实现,诸如在web服务中(例如使用简单对象访问协议)。一般而言,接口包括以下特征的任一组合:牢固耦合、松散耦合、同步和异步。此外,接口可以符合标准协议、专用协议、或标准和专用协议的任意组合。
本文中所描述的接口可以全部都是单个接口的部分,或可以实现为独立的接口或者其中的任意组合。接口可本地或远程地执行以提供功能。此外,接口可包括比本文中所示或描述的更多或更少的功能。
在操作中,计算机130执行诸如图2所示的计算机可执行指令,以生成所请求的数据,并在联网的应用程序之间传递它们。
附录A列出了根据本发明的示例性名空间、事件处理器以及参数。在附录A中,DatePickerEventHandler处理器类型包括日期挑选器的事件。日期挑选器是允许用户在应用程序中的若干个环境中选择日期的用户界面组件。RenderMonth事件呈现对应于月份的HTML片段。当用户点击以导航到2005年1月时,本发明的客户机组件将RenderMonth事件发送给服务器,该服务器获取输入参数(例如‘m’表示月份,为日期2005年1月)并呈现该月的HTML片段。所呈现的HTML片段被发回到客户机。
MessageListViewEventHandler处理器类型包括用于例如在收件箱中示出消息的消息列表视图的事件。当用户选择一些消息要删除时运行Delete事件。文件夹标识符由属性‘fld’表示。要删除的消息标识符数组由属性‘id’表示。
RecipientWellEventHandler是收件井的事件处理器。该处理器类型中的事件的一个示例是‘resolve’。‘Resolve’将电子邮件消息中的to、cc和bcc字段取作参数,它们是字符串数组。Resolve事件解析并分析这些字符串。例如如果用户键入“BobS”,则对于数组中对应于‘to’参数的单个项目“BobS”的数据请求被发送给服务器。该响应是HTML中带有“Bob Smith”的HTML片段,其中带有Bob Smith的电子邮件地址,并可能带有附属于它的其他数据。
接着描述日历视图事件处理器中方法GetViewPayload的详细解释。该方法的参数包括属性‘nvs’、‘fld’、‘days’、‘vt’和‘dir’。当日历视图需要被刷新时从客户机调用该事件处理器。日历视图在显示器的左侧显示时间条,其中以半个小时为增量,在一列中显示每一天。
当需要刷新日历视图时,就开始GetViewPayload事件。该事件从后端载入数据(例如在邮件箱中的用户日历中查询),并呈现描述该数据的代码(例如JavaScript)。所呈现的代码被称为有效载荷。该有效载荷被发送给客户机,客户机使用有效载荷数据来刷新视图。一示例性有效载荷包括每个预约的开始/结束时间、主题、地点、空闲/忙碌状态等。同样地,每个矩形的坐标在服务器中计算,并作为该有效载荷的一部分发送,以简化客户机侧的脚本。
GetViewPayload方法的参数包括属性‘nvs’、‘fld’、‘days’、‘vt’和‘dir’。‘nvs’属性是“no view state(没有视图状态)”属性,如果为真则指示无需保持视图状态。视图状态是一组定义视图的参数(例如,查看的日期数目和视图类型)。视图类型可以是每周或每天。如果‘nvs’参数是假,那么就保存视图状态直至用户下次登陆。‘fld’属性是“folder identifier(文件夹标识符)”属性,对应于要查看的日历文件夹的标识符。‘days’属性包括要查看日期的数组。‘vt’属性对应于每天或每周的“view type(视图类型)”。‘dir’属性是可任选指定的导航箭头“direction(方向)”。设置这个属性意味着用户点击导航箭头,服务器应该基于‘days’属性计算要查看的下一组日期。例如,如果‘days’属性是3月的2号、3号和4号且‘dir’属性被设置成+1,那么服务器会对这些的每一个增加7天(例如以7天为增量推进的多天视图)。如果‘days’属性仅是3月2日(例如单日视图),则点击向右箭头导航到3月3日,因此服务器仅增加1天。
对GetViewPayload方法的示例性请求如下所示。
POST/mailclient/ev.owa?oeh=1&ns=CalendarView&ev=GetViewPayload
HTTP/1.1
Body:
<params><fld>LgAAAABjczgvWhhRQKW7OM2Ok4GDAQD4If+Jk6V9Sa
z9+rfNa9e8AAAAABe
dAAAB</fId><days><item>2004-12-15T00:00:00</item><item>2004-12-
16T00:00:
00</item><item>2004-12-
17T00:00:00</item></days><vt>1</vt><nvs>1</nvs></
params>
对于以上请求的示例性响应的一部分如下所示。
a_eERow=1;a_sFTt1=″Calendar:December 2004″;a_iNRP=1;a_rgCal=new
Array(nc(″RgAAAABjctheWhhRQKW7OM2Ok4GDBwD4If+Jk6V9Saz9+rf
Na9e8AAAAABedAAD4If+Jk6V9Saz9+rfNa9e8AAAAADTfAAAI″,″12-
15-200417:30:00U″,″12-15-200418:00:00U″,″Strategy Meeting″,″Conf
Room 1″,2,1,″Bob
Smith″,0,1,0,0,″″),nc(″CAjGsFAnk8AARgAAAABjczgthehRQKW7OM2Ok
4GDBwD4If+Jk6V9Saz9+rfNa9e8AAAAABedAAD4If+Jk6V9Saz9+rfNa9e
8AAAAACNqAAAJ″,″12-15-200421:00:00U″,″l2-15-200421:30:00
U″,″Out of
Office″,″″,2,0,″″,1,3,1,0,″″),nc(″RgAAAABjczgvWhhRQKW7OM2Ok4GDB
wD4If+Jk6V9Saz9+rfNa9e8AAAAABedAAD4If+Jk6V9Saz9+rfNa9e8AAA
AADThAAAI″,″12-16-200400:00:00U″,″12-16-200401:00:00U″,″Portfolio
Development Meeting″,″Conf Room 2″,2,1,″Joe
A.″,1,1,0,0,″″));a_rgDay=new Array();var
t;t=newCalDay(″15″,″Wednesday″″,15,12,2004);av(t,0,19,1,1,0);av(t,0,24,0.5,4
,1);
av(t,0.5,26,0.5,1,2);av(t,0,32,1,2,3);av(t,0,34,1,2,4);a_rgDay[0]=t;t=newCalDa
y(″16″,″Thursday″,16,12,2004);av(t,0,20,1,1,5);av(t,0,21,1,2,6);av(t,0,23,1,2,7
);av(t,0,25,1,1,8);av(t,0,28,0.5,6,10);av(t,0.5,28,0.5,4,9);av(t,0.5,33,0.5,3,11);a
_rgDay[1]=t;t=newCalDay(″17″,″Friday″,17,12,2004);av(t,0,20,0.5,4,13);av(t,
0.5,20,0.5,2,12);av(t,0.5,23,0.5,3,14);av(t,0,25,0.5,1,15);av(t,0,28,0.5,2,17);av
(t,0.5,29,0,5,3,I8);avf(t,26,22,3);a_rgDay[2]=t;a_rgEvt=new
Array(ne(2,0,1,16,2,0))
这里所示出和描述的方法的执行或履行顺序并非必需如此,除非另有指定。即,方法的要素可用任何顺序执行,除非另有指定,且方法可以包括比这里所揭示的要素更多或更少的要素。例如,期望在另一要素之前、同时或之后执行或履行特定的要素是在本发明的范围之内的。
当引入本发明或其实施例的要素时,冠词“一”、“一个”、“该”和“所述”旨在表示有一个或多个要素。术语“包括”、“包含”和“具有”旨在意为包括的,并表示可能除了所列示的要素外有其他要素。
根据以上内容,可以看出实现了本发明的若干个目的,并获得了其他有利结果。
由于可对上述结构、产品和系统作出各种改变而不背离本发明的范围,上述描述中包含的和附图中所示的所有事物旨在被解释为是示例性的而非限制性的。
附录A
以下表格示出了服务器部署的电子邮件应用程序的电子邮件名空间(例如Mail.Client)中的示例性事件和参数。
处理器类型 |
‘Mail.Clients.DatePickerEventHandler’ |
事件处理器名称 |
‘RenderMonth’.Verb:‘Get’ |
参数名称 |
‘uF’,类型:‘System.Int32’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘m’,类型:‘System.DateTime’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
事件处理器名称 |
‘GetFreeBusy’.Verb:‘Get’ |
参数名称 |
‘Month’,类型:‘System.DateTime’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
表A1.日期挑选器事件处理器的示例性事件处理器和参数
处理器类型 |
‘Mail.Clients.MessageListViewEventHandler’ |
事件处理器名称 |
‘Delete’.Verb:‘Post’ |
参数名称 |
‘fld’,类型:‘MailObjects.IUniqueItemId’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘id’,类型:‘Mail.Objects.IUniqueItemId’,isArray:‘True’,isOptional:‘False’,isStruct:‘False’ |
事件处理器名称 |
‘PermanentDelete’.Verb:‘Post’ |
参数名称 |
‘id’,类型:‘Mail.Objects.IUniqueItemId’,isArray:‘True’,isOptional:‘False’,isStruct:‘False’ |
事件处理器名称 |
‘MarkAsRead’.Verb:‘Post’ |
参数名称 |
‘id’,类型:‘Mail.Objects.IUniqueItemId’,isArray:‘True’,isOptional:‘False’,isStruct:‘False’ |
事件处理器名称 |
‘MarkAsUnread’.Verb:‘Post’ |
参数名称 |
‘id’,类型:‘Mail.Objects.IUniqueItemId’,isArray:‘True’,isOptional:‘False’,isStruct:‘False’ |
事件处理器名称 |
‘PersistWidth’.Verb:‘Post’ |
参数名称 |
‘fld’,类型:‘Mail.Objects.IUniqueItemId’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘w’,类型:‘System.Int32’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
事件处理器名称 |
‘PersistHeight’.Verb:‘Post’ |
参数名称 |
‘fld’,类型:‘Mail.Objects.IUniqueItemId’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘h’,类型:‘System.Int32’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
事件处理器名称 |
‘PersistReadingPane’.Verb:‘Post’ |
参数名称 |
‘s’,类型:‘Mail.Clients.Common.ReadingPanePosition’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘fld’,类型:‘Mail.Objects.IUniqueItemId’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
事件处理器名称 |
‘Refresh’.Verb:‘Get’ |
参数名称 |
‘sId’,类型:‘Mail.Objects.IUniqueItemId’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘sO’,类型:‘Mail.Objects.SortOrder’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘sC’,类型:‘Mail.Clients.Controls.ColumnId’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘mL’,类型:‘System.Boolean’,isArray:‘False’,isOptional:‘False’,isStruct.‘False’ |
参数名称 |
‘sR’,类型:‘System.Int32’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
事件处理器名称 |
‘SeekNextItem’.Verb:‘Get’ |
参数名称 |
‘sR’,类型:‘System.Int32’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘mL’,类型:‘System.Boolean’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘sId’,类型:‘Mail.Objects.IUniqueItemId’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘mId’,类型:‘Mail.Objects.IUniqueItemId’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘sC’,类型:‘Mail.Clients.Controls.ColumnId’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘sO’,类型:‘Mail.Objects.SortOrder’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
事件处理器名称 |
‘SeekPreviousItem’.Verb:‘Get’ |
参数名称 |
‘mL’,类型:‘System.Boolean’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘sId’,类型:‘Mail.Objects.IUniqueItemId’,isArray:‘False’,isOptional: ‘False’,isStruct:‘False’ |
参数名称 |
‘mId’,类型:‘Mail.Objects.IUniqueItemId’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘sR’,类型:‘System.Int32’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘sC’,类型:‘Mail.Clients.Controls.ColumnId’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘sO’,类型:‘Mail.Objects.SortOrder’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
事件处理器名称 |
‘ToggleMultiVsSingleLine’.Verb:‘Get’ |
参数名称 |
‘sId’,类型:‘Mail.Objects.IUniqueItemId’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘mL’,类型:‘System.Boolean’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘sR’,类型:‘System.Int32’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘sC’,类型:‘Mail.Clients.Controls.ColumnId’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘sO’,类型:‘Mail.Objects.SortOrder’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
事件处理器名称 |
‘FirstPage’.Verb:‘Get’ |
参数名称 |
‘sId’,类型:‘MailObjects.IUniqueItemId’,isArray:‘False’,isOptional:‘False’,isStruct.:‘False’ |
参数名称 |
‘sR’,类型:‘System.Int32’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘sC’,类型:‘Mail.Clients.Controls.ColumnId’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘sO’,类型:‘Mail.Objects.SortOrder’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘mL’,类型:‘System.Boolean’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
事件处理器名称 |
‘PreviousPage’.Verb:‘Get’ |
参数名称 |
‘sR’,类型:‘System.Int32’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘sId’,类型:‘Mail.Objects.IUniqueItemId’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘sC’,类型:‘Mail.Clients.Controls.ColumnId’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘sO’,类型:‘Mail.Objects.SortOrder’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘mL’,类型:‘System.Boolean’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
事件处理器名称 |
‘NextPage’.Verb:‘Get’ |
参数名称 |
‘sC’,类型:‘Mail.Clients.Controls.ColumnId’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘sO’,类型:‘Mail.Objects.SortOrder’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘mL’,类型:‘System.Boolean’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘sId’,类型:‘Mail.Objects.IUniqueItemId’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘sR’,类型:‘System.Int32’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
事件处理器名称 |
‘LastPage’.Verb:‘Get’ |
参数名称 |
‘sId’,类型:‘Mail.Objects.IUniqueItemId’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘mL’,类型:‘System.Boolean’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘tC’,类型:‘System.Int32’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘sC’,类型:‘Mail.Clients.Controls.ColumnId’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘sO’,类型:‘Mail.Objects.SortOrder’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
事件处理器名称 |
‘Sort’.Verb:‘Get’ |
参数名称 |
‘sC’,类型:‘Mail.Clients.Controls.ColumnId’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘sO’,类型:‘Mail.Objects.SortOrder’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘mL’,类型:‘System.Boolean’,isArray:‘False’, |
|
isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘sR’,类型:‘System.Int32’,isArray:‘False’,isOptional:‘True’,isStruct:‘False’ |
参数名称 |
‘sId’,类型:‘Mail.Objects.IUniqueItemId’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
事件处理器名称 |
‘MsgToPeople’.Verb:‘Post’ |
参数名称 |
‘id’,类型:‘Mail.Objects.IUniqueItemId’,isArray:‘True’,isOptional:‘False’,isStruct:‘False’ |
事件处理器名称 |
‘Move’.Verb:‘Post’ |
参数名称 |
‘destId’,类型:‘Mail.Objects.IUniqueItemI d’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘id’,类型:‘Mail.Objects.IUniqueItemId’,isArray:‘True’,isOptional:‘False’,isStruct:‘False’ |
事件处理器名称 |
‘Copy’.Verb:‘Post’ |
参数名称 |
‘destId’,类型:‘Mail.Objects.IUniqueItemId’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘id’,类型:‘Mail.Objects.IUniqueItemId’,isArray:‘True’,isOptional:‘False’,isStruct:‘False’ |
表A2.消息列表视图事件处理器的示例性事件处理器和参数
处理器类型 |
‘Mail.Client.RecipientWellEventHandler’ |
事件处理器名称 |
‘Resolve’.Verb:‘Post’ |
参数名称 |
‘Bcc’,类型:‘System.String’,isArray:‘True’,isOptional:‘True’,isStruct:‘False’ |
参数名称 |
‘Cc’,类型:‘System.String’,isArray:‘True’,isOptional:‘True’,isStruct:‘False’ |
参数名称 |
‘To’,类型:‘System.String’,isArray:‘True’,isOptional:‘True’,isStruct:‘False’ |
参数名称 |
‘Recips’,类型:‘Mail.Clients.Common.RecipientInfoAC’,isArray:‘True’,isOptional:‘True’,isStruct:‘True’ |
事件处理器名称 |
‘ResolveOneRecipient’.Verb:‘Post’ |
参数名称 |
‘n’,类型:‘System.String’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
事件处理器名称 |
‘GetRecipProps’.Verb:‘Post’ |
参数名称 |
‘id’,类型:‘System.String’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘rs’,类型:‘Mail.Clients.Common.RecipientSource’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
事件处理器名称 |
‘GetCache’.Verb:‘Get’ |
事件处理器名称 |
‘DeleteFromCache’.Verb:‘Post’ |
参数名称 |
‘Em’,类型:‘System.String’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
表A3.收件井事件处理器的示例性事件处理器和参数
处理器类型 |
‘Mail.Clients.CalendarViewEventHandler’ |
事件处理器名称 |
‘PersistWidth’.Verb:‘Post’ |
参数名称 |
‘w’,类型:‘System.Int32’,isArray:‘False’,isOptional: |
|
‘False’,isStruct:‘False’ |
参数名称 |
‘fld’,类型:‘Mail.Objects.IUniqueItemId’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
事件处理器名称 |
‘PersistHeight’.Verb:‘Post’ |
参数名称 |
‘fId’,类型:‘Mail.Objects.IUniqueItemId’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘h’,类型:‘System.Int32’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
事件处理器名称 |
‘PersistReadingPane’.Verb:‘Post’ |
参数名称 |
‘isMD’,类型:‘System.Boolean’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘s’,类型:‘Mail.Clients.Common.ReadingPanePosition’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘fId’,类型:‘Mail.Objects.IUniqueItemId’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
事件处理器名称 |
‘GetViewPayload’.Verb:‘Post’ |
参数名称 |
‘nvs’,类型:‘System.Boolean’,isArray:‘False’,isOptional:‘True’,isStruct:‘False’ |
参数名称 |
‘fld’,类型:‘Mail.Objects.IUniqueItemId’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘days’,类型:‘System.DateTime’,isArray:‘True’,isOptional:‘True’,isStruct:‘False’ |
参数名称 |
‘vt’,类型:‘Mail.Clients.Controls.CalendarViewType’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘dir’,类型:‘System.Int32’,isArray:‘False’,isOptional:‘True’,isStruct:‘False’ |
事件处理器名称 |
‘Move’.Verb:‘Post’ |
参数名称 |
‘et’,类型:‘System.DateTime’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘fId’,类型:‘Mail.Objects.IUniqueItemId’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘days’,类型:‘System.DateTime’,isArray:‘True’,isOptional:‘True’,isStruct:‘False’ |
参数名称 |
‘nvs’,类型:‘System.Boolean’,isArray:‘False’,isOptional:‘True’,isStruct:‘False’ |
参数名称 |
‘id’,类型:‘Mail.Objects.IUniqueItemId’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘st’,类型:‘System.DateTime’,isArray:‘False’,isOptional:‘False’,isStruct.‘False’ |
参数名称 |
‘vt’,类型:‘Mail.Clients.Controls.CalendarViewType’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
事件处理器名称 |
‘Delete’.Verb:‘Post’ |
参数名称 |
‘nvs’,类型:‘System.Boolean’,isArray:‘False’,isOptional:‘True’,isStruct:‘False’ |
参数名称 |
‘vt’,类型:‘Mail.Clients.Controls.CalendarViewType’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘id’,类型:‘Mail.Objects.IUniqueItemId’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘fld’,类型:‘Mail.Objects.IUniqueItemId’,isArray:‘False’,isOptional:‘False’,isStruct:‘False’ |
参数名称 |
‘days’,类型:‘System.DateTime’,isArray:‘True’,isOptional:‘True’,isStruct:‘False’ |
表A4.日历视图事件处理器的示例性事件处理器和参数