專利名稱:應(yīng)用構(gòu)架的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及用于構(gòu)造包含多個(gè)web服務(wù)的應(yīng)用的應(yīng)用構(gòu)架。
背景技術(shù):
當(dāng)今,web服務(wù)是用于通過因特網(wǎng)交換數(shù)據(jù)的標(biāo)準(zhǔn)化接口??蛻舳说膽?yīng)用可以利用服務(wù)器提供的web服務(wù)通過因特網(wǎng)從服務(wù)器請求數(shù)據(jù)。技術(shù)更先進(jìn)的應(yīng)用通常將各種web服務(wù)組合起來以獲得或處理所需數(shù)據(jù),例如提供和修改關(guān)于商業(yè)操作的信息。應(yīng)用開發(fā)者必須既提供用戶接口又提供應(yīng)用邏輯,以使得用戶可以與應(yīng)用交互并使得應(yīng)用基于各種涉及的web服務(wù)對數(shù)據(jù)執(zhí)行所需處理。
但是,例如如果改變商業(yè)操作要被應(yīng)用所反映,則這種復(fù)合應(yīng)用的應(yīng)用邏輯和用戶接口通常都需要快速改變。在典型的編程語言(例如JAVA)中,對改變的應(yīng)用邏輯和/或改變的用戶接口的低級別編程是耗時(shí)且困難的。因此,在現(xiàn)有技術(shù)中存在利用web服務(wù)的應(yīng)用可以如何被更有效地創(chuàng)建或修改的方法。
一種方法是商業(yè)流程執(zhí)行語言(BPEL),該語言例如在雜志“Computerwoche”2006 6.版第34頁的公開中有所描述。BPEL允許靈活地提供或改變對涉及多個(gè)web服務(wù)的數(shù)據(jù)進(jìn)行處理的應(yīng)用邏輯。
但是,申請人已經(jīng)發(fā)現(xiàn),快速創(chuàng)建或適應(yīng)涉及web服務(wù)的應(yīng)用的任務(wù)比單獨(dú)快速適應(yīng)應(yīng)用邏輯要求得更多。用戶接口(即數(shù)據(jù)輸入或輸出可能性)也需要被快速修改。在現(xiàn)有技術(shù)中,如何快速生成或改變圖形用戶界面一般是已知的,例如通過以圖形方式選擇和定位諸如復(fù)選框或列表等的用戶控件元素。在根據(jù)現(xiàn)有技術(shù)的應(yīng)用構(gòu)架中,由用戶接口生成的數(shù)據(jù)首先需要被某種中間代碼處理,以便將其轉(zhuǎn)換成適合于與BPEL交互的格式。改變用戶接口和/或應(yīng)用邏輯因此還需要低級別編程,以便確保利用BPEL修改的應(yīng)用邏輯和用戶接口仍舊可以一起工作。
因此,技術(shù)問題是提供這樣一種應(yīng)用構(gòu)架,其允許利用更少量的低級別編程來靈活地生成/或修改涉及web服務(wù)的應(yīng)用,以減少開發(fā)時(shí)間和相關(guān)的編程錯(cuò)誤風(fēng)險(xiǎn)。
發(fā)明內(nèi)容
該問題是利用一種用于構(gòu)造包含多個(gè)web服務(wù)的應(yīng)用的應(yīng)用構(gòu)架來解決的。該應(yīng)用構(gòu)架包括-布局編輯器,其適合于創(chuàng)建包含多個(gè)頁面的應(yīng)用的圖形用戶界面,每個(gè)頁面包含至少一個(gè)元素,用于與用戶交互以生成或修改數(shù)據(jù)集合;-控制層編輯器,其適合于針對所述圖形用戶界面的每個(gè)頁面創(chuàng)建接收和處理與各個(gè)頁面相關(guān)的數(shù)據(jù)集合的相應(yīng)代碼段;以及-生成器,該生成器從所述多個(gè)代碼段中生成組織(orchestration)序列,其中由引擎對所述組織序列的處理包含調(diào)用所述多個(gè)web服務(wù)。
在布局編輯器中創(chuàng)建的圖形用戶界面和由本發(fā)明的控制編輯器創(chuàng)建的處理邏輯之間的密切關(guān)系使得無需利用用于處理由用戶接口接收的數(shù)據(jù)的低級別語言(例如Java、C#等)進(jìn)行編程就能夠生成或修改應(yīng)用。具體而言,當(dāng)使得現(xiàn)有應(yīng)用的用戶接口和/或應(yīng)用邏輯適應(yīng)改變的需求時(shí),針對圖形用戶界面的每個(gè)頁面提供相應(yīng)的代碼段這一特征大大輔助了開發(fā)者的任務(wù)。
生成器負(fù)責(zé)從各個(gè)代碼段中生成單個(gè)組織序列。該序列隨后可被引擎在運(yùn)行時(shí)處理,該引擎例如直接解釋序列或者將其轉(zhuǎn)換成可執(zhí)行的格式,例如JAVA類。
在優(yōu)選實(shí)施例中,該應(yīng)用構(gòu)架還適合于創(chuàng)建每個(gè)代碼段,以使得其經(jīng)由web服務(wù)接口接收數(shù)據(jù)集合,其中該接口的定義優(yōu)選地包含各個(gè)頁面調(diào)用的至少一個(gè)函數(shù)和數(shù)據(jù)集合的XML模式定義(XSD),尤其是web服務(wù)定義(WSDL)。尤其優(yōu)選的是這樣一個(gè)實(shí)施例,其中應(yīng)用構(gòu)架還適合于針對布局編輯器中創(chuàng)建的每個(gè)頁面自動得到XSD和至少一個(gè)WSDL。結(jié)果,接口定義被與應(yīng)用邏輯獨(dú)立定義的頁面有效驅(qū)動,并且只定義其需要告訴應(yīng)用邏輯的數(shù)據(jù)接口和函數(shù)。
在本發(fā)明一個(gè)實(shí)施例中,控制層編輯器適合于創(chuàng)建代碼段作為以商業(yè)流程執(zhí)行語言(BPEL)實(shí)現(xiàn)的段,并且其中組織序列是BPEL序列,該序列可以被BPEL引擎處理。BPEL是標(biāo)準(zhǔn)化的平臺,其被獨(dú)立且具體地設(shè)計(jì)以組織web服務(wù)。另一優(yōu)點(diǎn)在于可以處理作為變量的XML文檔。此外,與上述低級別基于指針的編程語言相比,更易于使用并且可以至少針對簡單情形作為流程圖被可視化。但是,雖然BPEL對于實(shí)現(xiàn)本發(fā)明的代碼段是優(yōu)選的,但是其他語言也可被使用,例如.NET實(shí)現(xiàn)方式和NATURAL實(shí)現(xiàn)方式等等。
根據(jù)本發(fā)明另一方面,每個(gè)代碼段優(yōu)選地包含多個(gè)方法段,其中每個(gè)方法段對應(yīng)于在圖形用戶界面的各個(gè)頁面上生成的一個(gè)函數(shù)調(diào)用。這是另一優(yōu)選特征,其附加地輔助開發(fā)針對對應(yīng)于用戶接口的每個(gè)頁面的應(yīng)用邏輯的結(jié)構(gòu)化代碼段。
最后,由該應(yīng)用構(gòu)架構(gòu)造的應(yīng)用的組織序列的處理優(yōu)選地包含保持對象的狀態(tài),并基于在一個(gè)或多個(gè)代碼段中定義的操作來處理狀態(tài)。對狀態(tài)的處理優(yōu)選地包括將對象轉(zhuǎn)換成適合于web服務(wù)的格式,執(zhí)行web服務(wù)以及將web服務(wù)的響應(yīng)轉(zhuǎn)換回對象的初始格式。在本發(fā)明的一個(gè)實(shí)施例中,對象包括遵循XSD的XML數(shù)據(jù),并且轉(zhuǎn)換是利用作為web服務(wù)封裝的XSLT來執(zhí)行的。如果BPEL段被用作代碼段,該封裝為web服務(wù)則是優(yōu)選的,因?yàn)锽PEL本身當(dāng)前不提供將一個(gè)序列嵌套在另一個(gè)序列中的概念。
對所述應(yīng)用構(gòu)架的進(jìn)一步改進(jìn)是從屬權(quán)利要求的主題。
另外,本發(fā)明涉及利用上述應(yīng)用構(gòu)架的方法、用上述應(yīng)用構(gòu)架構(gòu)造的應(yīng)用和包含上述應(yīng)用構(gòu)架的數(shù)據(jù)載體。
在以下詳細(xì)描述中,參考附圖進(jìn)一步描述了本發(fā)明的當(dāng)前優(yōu)選實(shí)施例圖1圖形用戶界面的各個(gè)頁面的示意性表示;圖2包含用于與用戶交互的多個(gè)控件元素的單個(gè)頁面的示意性表示;圖3圖形用戶界面、應(yīng)用邏輯和相關(guān)的web服務(wù)之間的一般關(guān)系的示意性表示;圖4在本發(fā)明的優(yōu)選實(shí)施例中,從頁面的布局定義中自動得出的數(shù)據(jù)和函數(shù)的集合的示意性表示;圖5本發(fā)明的圖形用戶界面的實(shí)際頁面的示例;圖6圖形用戶界面的頁面和BPEL代碼段之間的優(yōu)選1∶1關(guān)系的示意性表示;圖7從多個(gè)BPEL段生成BPEL程序的生成器的示意性表示;圖8在本發(fā)明的優(yōu)選實(shí)施例中,BPEL段的內(nèi)外結(jié)構(gòu)的示意性表示;以及圖9在本發(fā)明的另一優(yōu)選實(shí)施例中,BPEL段的內(nèi)外結(jié)構(gòu)的示意性表示。
具體實(shí)施例方式
以下,在第一部分中,將說明由本發(fā)明的應(yīng)用構(gòu)架的實(shí)施例執(zhí)行的用戶接口到web服務(wù)處理的映射。利用BPEL段的web服務(wù)處理本身的優(yōu)選實(shí)現(xiàn)方式將在隨后的部分中論述。
如圖1示例性示出的,利用本發(fā)明的應(yīng)用構(gòu)架的實(shí)施例構(gòu)成的應(yīng)用的圖形用戶界面被分成頁面10。每個(gè)頁面10代表在運(yùn)行時(shí)呈現(xiàn)給用戶的一定量的數(shù)據(jù)和函數(shù)。頁面10之間存在頁面導(dǎo)航,其通常包括●跟隨一系列頁面(參見圖1中的箭頭)●打開頁面,作為模式/非模式彈出框●頁面的嵌套(nesting)(參見圖1的頁面4中嵌套的頁面5)頁面10通常代表某些需要被用戶操作的專用的自包含應(yīng)用任務(wù)。該應(yīng)用任務(wù)的定義由頁面的設(shè)計(jì)者/開發(fā)者決定。頁面10在內(nèi)部被構(gòu)造成控件11??丶?1優(yōu)選地代表可重用組件,可重用組件代表某片數(shù)據(jù)(例如輸入字段)和/或某個(gè)行為(例如按鈕)。
頁面的處理到其相應(yīng)的應(yīng)用邏輯的耦合一般按如下方式工作(參見圖3)●頁面10代表一定量的數(shù)據(jù)和函數(shù)。頁面的任務(wù)是利用控件11使該數(shù)據(jù)可視化,并將該數(shù)據(jù)的改變(例如用戶輸入到域中)或函數(shù)調(diào)用(例如用戶按下按鈕)傳達(dá)給應(yīng)用的應(yīng)用邏輯20。
●頁面10的布局由布局編輯器中的布局定義來限定。布局定義保存了哪個(gè)控件11被用在頁面10中的信息。
●在布局定義中,每個(gè)控件11是利用其可見屬性(例如顏色、位置)和其綁定屬性來指定的。綁定屬性定義頁面數(shù)據(jù)的哪部分被相應(yīng)的控件11所請求/訪問,和/或哪個(gè)函數(shù)被相應(yīng)的控件所調(diào)用。
圖3示意性地反映出對包含web服務(wù)30的應(yīng)用的用戶的輸入的標(biāo)準(zhǔn)處理。頁面10在運(yùn)行時(shí)從應(yīng)用邏輯20請求其數(shù)據(jù)并將該數(shù)據(jù)呈現(xiàn)給用戶。用戶例如通過執(zhí)行輸入(未示出)來操作數(shù)據(jù)。在某些與同步相關(guān)的時(shí)間點(diǎn)(例如按下按鈕),更新的頁面的數(shù)據(jù)與關(guān)于哪個(gè)函數(shù)將處理的信息一起被發(fā)回應(yīng)用邏輯20。應(yīng)用邏輯20接收被操作的頁面數(shù)據(jù),對其進(jìn)行處理(例如執(zhí)行某種涉及一個(gè)或多個(gè)web服務(wù)30的計(jì)算)并將更新的數(shù)據(jù)發(fā)回頁面10。頁面10接收該更新的數(shù)據(jù),更新其控件11,以使得被可視化的數(shù)據(jù)被調(diào)整。
在現(xiàn)有技術(shù)的應(yīng)用構(gòu)架中,圖形用戶界面的頁面10和應(yīng)用邏輯20之間的通信通常是由布置在用戶接口和應(yīng)用邏輯之間的單獨(dú)的中間層(圖3中未示出)來提供的。利用低級別編程,用戶接口處用戶的輸入被中間層讀出并被轉(zhuǎn)發(fā)到應(yīng)用邏輯。無論何時(shí)只要該通信的至少一端改變,即用戶接口的頁面10的控件11中的任意一個(gè)改變和/或應(yīng)用邏輯20,中間層的低級別編程都需要被重復(fù)。這非常耗時(shí)并且可能在總體數(shù)據(jù)處理中導(dǎo)致錯(cuò)誤。
為了克服這些缺點(diǎn),本發(fā)明的所述實(shí)施例在技術(shù)上和語義上解除了頁面處理到應(yīng)用邏輯20的耦合。因此,本發(fā)明的實(shí)施例提供了頁面10和應(yīng)用邏輯20之間的程序接口定義(參見圖4)。該接口定義包含●在每次頁面使其數(shù)據(jù)與相應(yīng)的應(yīng)用邏輯(圖4中未示出)同步時(shí)被交換的頁面10的數(shù)據(jù)的模式(schema)定義。
●與數(shù)據(jù)同步相關(guān)聯(lián)的頁面10調(diào)用的函數(shù)列表。
在優(yōu)選實(shí)施例中,web服務(wù)接口被用作具體實(shí)現(xiàn)方式。作為每個(gè)頁面的結(jié)果,從頁面的布局(參見圖4)中自動得到以下定義●頁面的數(shù)據(jù)的XML模式41。該XML模式呈現(xiàn)出各個(gè)頁面10的“網(wǎng)狀(net)數(shù)據(jù)結(jié)構(gòu)”。
●預(yù)期應(yīng)用邏輯20可獲得的web服務(wù)的web服務(wù)定義42。
需要指出,程序接口定義是由頁面10驅(qū)動的。在本發(fā)明的所述實(shí)施例中,頁面是基本獨(dú)立于應(yīng)用邏輯20定義的,并且只定義了其需要與應(yīng)用邏輯20通信的數(shù)據(jù)和函數(shù)的接口。
示例以下頁面被定義為圖5所示頁面,用于查看某些文章數(shù)據(jù)。頁面布局(利用“應(yīng)用設(shè)計(jì)器(Application Designer)”)被定義為< xml version="1.0"encoding="UTF-8" ><xcipage xciname="test"><xcisetup>
<xciparameter paramname="test"paramtype="xs:string">
</xciparameter></xcisetup><titlebar name="Article Browser"></titlebar><header withdistance="false">
<button name="Save"method="onSave">
</button></header><pagebody>
<rowarea name="Article Selection">
<itr>
<label name="Article Id"width="120">
</label>
<field valueprop="articleid"width="200">
</field>
<hdist width="10">
</hdist>
<button name="Read"method="onRead">
</button>
</itr>
</rowarea><rowarea name="Article Details">
<itr takefullwidth="true">
<label name="Description"width="120">
</label>
<field valueprop="description"width="100%"displayonly="true">
</field>
</itr>
<itr>
<label name="Type"width="120">
</label>
<field valueprop="type"width="200"displayonly="true">
</field>
</itr>
</rowarea>
<rowarea name="List of Suppliers">
<itr takefullwidth="true">
<textgridsss2 griddataprop="suppliers"rowcount="10"width="100%"selectprop="selected"hscroll="true"directselectmethod="onSelect"directselectevent="ondblclick">
<column name="Id"property="supplierid"width="100">
</column>
<column name="Name"property="name"width="50%">
</column>
<column name="Description"property="description"width="50%">
</column>
</textgridsss2>
</itr>
</rowarea></pagebody><statusbar withdistance="false"></statusbar></xcipage>
在該頁面布局中,某些控件定義它們到某些數(shù)據(jù)的綁定示例1<field valueprop="description"width="100%"displayonly="true">
</field>
該域期望數(shù)據(jù)元素“description”可用。
示例2<textgridsss2 griddataprop="suppliers"rowcount="10"width="100%"selectprop="selected"hscroll="true"directselectmethod="onSelect"directselectevent="ondblclick">
<column name="Id"property="supplierid"width="100">
</column>
<column name="Name"property="name"width="50%">
</column>
<column name="Description"property="description"width="50%">
</column>
</textgridsss2>
該網(wǎng)格(grid)期望一列供應(yīng)者(suppliers)可用。對于每個(gè)供應(yīng)者,期望“supplierid”、“name”和“description”可用。頁面之外,以下XML模式定義被創(chuàng)建
< xml version="1.0" >
<xs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema"xmlns:pg="http://www.softwareag.com/xci/test/test"targetNamespace="http://www.softwareag.com/xci/test/test"elementFormDefault="qualified">
<xs:simpleType name="methodType">
<xs:restriction base="xs:string">
<xs:enumeration value="xciInit">
</xs:enumeration>
<xs:enumeration value="onSave">
</xs:enumeration>
<xs:enumeration value="onRead">
</xs:enumeration>
<xs:enumeration value="onSelect">
</xs:enumeration>
</xs:restriction></xs:simpleType><xs:complexType name="dataType">
<xs:sequence>
<xs:element name="xciParameters"minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="test"type="xs:string"minOccurs="0">
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="suppliers"minOccurs="0"maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="selected"type="xs:string"minOccurs="0">
</xs:element>
<xs:element name="supplierid"type="xs:string"minOccurs="0">
</xs:element>
<xs:element name="name"type="xs:string"minOccurs="0">
</xs:element>
<xs:element name="description"type="xs:string"minOccurs="0">
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="articleid"type="xs:string"minOccurs="0">
</xs:element>
<xs:element name="description"type="xs:string"minOccurs="0">
</xs:element>
<xs:element name="type"type="xs:string"minOccurs="0">
</xs:element>
</xs:sequence></xs:complexType></xs:schema>
該模式定義的一部分是控件11所需要的數(shù)據(jù)以及從控件調(diào)用的函數(shù)列表。Web服務(wù)定義如下< xml version="1.0"encoding="UTF-8" ><definitions name="test"targetNamespace="http://www.softwareag.com/xci/test/test"xmlns="http://schemas.xmlsoap.org/wsdl/"xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"xmlns:tns="http://www.softwareag.com/xci/test/test"xmlns:xs="http://www.w3.org/2001/XMLSchema"><types>
<xs:schema elementFormDefault="qualified"targetNamespace="http://www.softwareag.com/xci/test/test"xmlns:pg="http://www.softwareag.com/xci/test/test"xmlns:ht="http://www.softwareag.com/xci/xciHeaderTrailer"xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:importnamespace="http://www.softwareag.com/xci/xciHeaderTrailer"schemaLocation="xciHeaderTrailer.xsd"/>
<xs:simpleType name="methodType">
<xs:restriction base="xs:string">
<xs:enumeration value="xciInit"></xs:enumeration>
<xs:enumeration value="onSave"></xs:enumeration>
<xs:enumeration value="onRead"></xs:enumeration>
<xs:enumeration value="onSelect"></xs:enumeration>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="dataType">
<xs:sequence>
<xs:element name="xciParameters"minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="test"type="xs:string"minOccurs="0">
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="suppliers"minOccurs="0"maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="selected"type="xs:string"minOccurs="0">
</xs:element>
<xs:element name="supplierid"type="xs:string"minOccurs="0">
</xs:element>
<xs:element name="name"type="xs:string"minOccurs="0">
</xs:element>
<xs:element name="description"type="xs:string"minOccurs="0">
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="xMLDataMode"type="xs:string"minOccurs="0">
</xs:element>
<xs:element name="articleid"type="xs:string"minOccurs="0">
</xs:element>
<xs:element name="description"type="xs:string"minOccurs="0">
</xs:element>
<xs:element name="type"type="xs:string"minOccurs="0">
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:element name="xdo">
<xs:complexType>
<xs:sequence>
<xs:element ref="ht:header"/>
<xs:element name="data"type="pg:dataType"/>
<xs:element ref="ht:trailer"/>
</xs:sequence>
</xs:complexType>
</xs:element></xs:schema></types><message name="xdo"><part element="tns:xdo"name="xdo"/></message><portType name="test"><operation name="doProcess">
<input message="tns:xdo"/>
<output message="tns:xdo"/></operation></portType></definitions>
該示例性web服務(wù)包含一個(gè)操作“doProcess”,其預(yù)期被應(yīng)用邏輯20所實(shí)現(xiàn)。該操作的in/out參數(shù)是代表頁面數(shù)據(jù)和由頁面處理調(diào)用的函數(shù)的XML文檔。
在以下描述中,在本發(fā)明的優(yōu)選實(shí)施例中利用BPEL的應(yīng)用邏輯20的實(shí)現(xiàn)方式將被更詳細(xì)描述。
如上所述,由布局編輯器創(chuàng)建的應(yīng)用用戶接口被分成頁面10,其中每個(gè)頁面10覆蓋了被呈現(xiàn)給用戶的一定量的數(shù)據(jù)和函數(shù)。此外,如上所述,在不同的頁面10之間存在導(dǎo)航(例如將它們置于某個(gè)序列中)。每個(gè)頁面10與一個(gè)web服務(wù)相關(guān),該web服務(wù)與需要應(yīng)用邏輯20提供的頁面數(shù)據(jù)和函數(shù)相關(guān)聯(lián)。
本發(fā)明的當(dāng)前優(yōu)選實(shí)施例使用BPEL作為用于實(shí)現(xiàn)應(yīng)用邏輯20的通用編程語言。根據(jù)本發(fā)明的優(yōu)選實(shí)施例(參見圖6),通過應(yīng)用以下原理可以大大簡化對BPEL的實(shí)現(xiàn)●每個(gè)頁面10用一個(gè)所謂的BPEL段50代表,其中該段負(fù)責(zé)處理各個(gè)頁面的數(shù)據(jù)和函數(shù)。
●BPEL段50優(yōu)選地彼此隔離,以使其相應(yīng)的數(shù)據(jù)對其他BPEL段不可見。
●可以共享一個(gè)被定義為交叉段的明確定義的應(yīng)用上下文。
根據(jù)本發(fā)明實(shí)施例,應(yīng)用構(gòu)架的生成器100(參見圖7)負(fù)責(zé)從多個(gè)BPEL段50中生成單個(gè)包含的(comprehensive)BPEL序列80。每個(gè)BPEL段50包含針對該段的BPEL代碼和由該段實(shí)現(xiàn)的web服務(wù)定義。最終生成的BPEL序列80充當(dāng)程序,該程序在運(yùn)行時(shí)可被部署到遵循BPEL規(guī)范的任何BPEL引擎110。
在一個(gè)BPEL段50(代表用于一個(gè)頁面10的應(yīng)用邏輯)中,優(yōu)選地應(yīng)用以下結(jié)構(gòu)(參見圖8)●頁面的數(shù)據(jù)內(nèi)容的XML表示41對預(yù)先定義的BPEL變量(在一個(gè)實(shí)施例中稱之為“xciState”)來說是可用的。
●可以定義一個(gè)或多個(gè)不與頁面數(shù)據(jù)直接相關(guān)并且影響B(tài)PEL段50提供的應(yīng)用邏輯的附加段專用變量45。
●用戶接口調(diào)用上的每個(gè)反應(yīng)(reaction)被方法段51(包含負(fù)責(zé)處理該特定調(diào)用的BPEL代碼)的定義反映出。任意種類的BPEL代碼可被用在這樣的方法段中。
●在方法調(diào)用51的BPEL代碼中,頁面的數(shù)據(jù)可被訪問和操作。從頁面發(fā)送的請求按以下方式被自動處理●(1)請求被總BPEL序列80接收。
●(2)正確的BPEL段50被選出以用于處理。
●(3)用與請求一起到來的頁面數(shù)據(jù)填充變量“xciState”。
●(4)正確的方法段51被選出以用于處理。
●(5)方法被執(zhí)行,其可以包含一個(gè)或多個(gè)web服務(wù)30。頁面數(shù)據(jù)可以被更新。
●(6)更新的頁面數(shù)據(jù)在響應(yīng)內(nèi)被發(fā)回。
對BPEL開發(fā)者而言,只有步驟(5)是可見的,所有其他步驟都由生成器自動生成。
另外,對于每個(gè)BPEL段50,一組默認(rèn)方法段可用(參見圖9)●xciInit 52該方法段在BPEL段50在運(yùn)行時(shí)第一次被使用時(shí)被調(diào)用。任意種類的段專用初始化可被執(zhí)行。
●xciSetup 53該方法段在頁面10作為頁面導(dǎo)航的結(jié)果被調(diào)用時(shí)被調(diào)用。作為該導(dǎo)航的一部分,相應(yīng)的BPEL段接收了表明針對相應(yīng)頁面10哪些數(shù)據(jù)將被加載的信息。
●xciPreMethod 54/xciPostMethod 55這些方法在調(diào)用任意其他方法段50之前/之后被調(diào)用。
如在介紹部分所述,BPEL被設(shè)計(jì)用于組織web服務(wù),例如圖3所示的web服務(wù)30。結(jié)果,如果某個(gè)用戶接口包含若干頁面10,從各個(gè)BPEL段50獲得的結(jié)果BPEL序列80將相當(dāng)長。因此在一個(gè)實(shí)施例中,本發(fā)明提供了使得可有效地使用BPEL的應(yīng)用構(gòu)架。本發(fā)明的一個(gè)方面在于使BPEL“有狀態(tài)/對象感知”。
狀態(tài)反映了一組數(shù)據(jù)(例如圖4、8和9所示的XML數(shù)據(jù)41的網(wǎng)狀數(shù)據(jù)對象)的狀態(tài)。這樣的狀態(tài)被保持持續(xù)一定時(shí)間。例如,屏幕的網(wǎng)狀數(shù)據(jù)在屏幕被處理的持續(xù)時(shí)間(或者可能更長)被保持。
可用多種操作來更新該狀態(tài)。例如,在BPEL操作可能包括web服務(wù)30(參見圖3)之一的網(wǎng)狀數(shù)據(jù)對象時(shí),數(shù)據(jù)被輸入到屏幕中或者某些操作被觸發(fā)運(yùn)行。該狀態(tài)是所有操作所參考的中心部分。因此,由用戶接口調(diào)用觸發(fā)的多種函數(shù)可能涉及總BPEL序列80的不同部分。但是它們總是導(dǎo)致以下處理步驟(a)接收一個(gè)網(wǎng)狀數(shù)據(jù)對象,(b)操作該網(wǎng)狀數(shù)據(jù)對象,(c)響應(yīng)該網(wǎng)狀數(shù)據(jù)對象。
例如,對針對某個(gè)屏幕的BPEL序列80中的任意web服務(wù)30的調(diào)用按以下順序執(zhí)行
(a)從網(wǎng)狀數(shù)據(jù)對象中獲得數(shù)據(jù)并將該數(shù)據(jù)轉(zhuǎn)換為對web服務(wù)30而言合適的結(jié)構(gòu),(b)調(diào)用web服務(wù)30,(c)將web服務(wù)30的響應(yīng)轉(zhuǎn)換回網(wǎng)狀數(shù)據(jù)對象。
該轉(zhuǎn)換是利用XSLT來執(zhí)行的。因?yàn)閄SLT不被本地BPEL陳述所支持,因此它需要被相應(yīng)的web服務(wù)所封裝。一種工具可以生成所有這些部分來構(gòu)成有效的BPEL序列80。
示例以下BPEL段代表兩個(gè)頁面的處理第一頁面“address”,保存方法“xciInit”和“onCheck”< xml version="1.0"encoding="UTF-8" ><xci:bpelo xmlns:xci="http://www.softwareag.com/xci/"xmlns="http://schemas.xmlsoap.org/ws/2003/03/business-process/"xmlns:ht="http://www.softwareag.com/xci/xciHeaderTrailer"xmlns:xo="http://www.softwareag.com/xci/wt/address"name="address"targetNamespace="http://www.softwareag.com/xci/wt/address"><xci:variables/><xci:methods>
<xci:method name="xciInit">
<sequence name="Sequence">
<empty name="Empty"/>
</sequence>
</xci:method>
<xci:method name="onCheck">
<sequence name="Sequence">
<empty name="Empty"/>
</sequence>
</xci:method></xci:methods></xci:bpelo>
第二頁面“second”,保存方法“xciInit”< xml version="1.0"encoding="UTF-8" ><xci:bpelo xmlns:xci="http://www.softwareag.com/xci/"xmlns="http://schemas.xmlsoap.org/ws/2003/03/business-process/"xmlns:ht="http://www.so ftwareag.com/xci/xciHeaderTrailer"xmlns:xo="http://www.softwareag.com/xci/wt/second"name="second"targetNamespace="http://www.softwareag.com/xci/wt/second"><xci:variables/><xci:methods>
<xci:method name="xciInit">
<sequence name="Sequence">
<empty name="Empty"/>
</sequence>
</xci:method></xci:methods></xci:bpelo>
從頁面中生成的BPEL代碼如下< xml version="1.0"encoding="UTF-8" ><process suppressJoinFailure="yes"xmlns="http://schemas.xmlsoap.org/ws/2003/03/business-pocess/"xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/"xmlns:xsd="http://www.w3.org/2001/XMLSchema"name="wt"targetNamespace="http://www.softwareag.com/xci/wt"xmlns:ht="http://www.softwareag.com/xci/xciHeaderTrailer"xmlns:xciNs2="http://www.softwareag.com/xci/wt/second"xmlns:plnk="http://schemas.xmlsoap.org/ws/2003/05/partner-link/"xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"xmlns:xciNs3="http://www.softwareag.com/xci/wt/xciApplication"xmlns:tns="http://www.softwareag.com/xci/wt"xmlns:wsa="http://schemas.xmlsoap.org/ws/2003/03/addressing"xmlns:xciNs1="http://www.softwareag.com/xci/wt/address"xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"xmlns:xciNs6="http://com/softwareag/xci/ws/trans formservice"xmlns:xciNs5="http://com/softwareag/xci/ws/logservice"xmlns:xciNs4="http://wt.java.xci.softwareag.com"><partnerLinks>
<partnerLink name="addressPL"myRole="interface"partnerLinkType="tns:address"/>
<partnerLink name="secondPL"myRole="interface"partnerLinkType="tns:second"/>
<partnerLink name="xciApplicationPL"myRole="interface"partnerLinkType="tns:xciApplication"/>
<partnerLink name="invokejavaPL"partnerRole="invokejavaProvider"partnerLinkType="tns:invokejava"/>
<partnerLink name="XCILogPL"partnerRole="XCILogProvider"partnerLink Type="tns:XCILog"/>
<partnerLink name="XCITransformerPL"partnerRole="XCITransformerProvider"partnerLinkType="tns:XCITransformer"/></partnerLinks><variables>
<variable name="stillRunning"type="xsd:boolean"/>
<variable messageType="xciNs3:xdo"name="m_xciApplication"/>
<variable messageType="xciNs1:xdo"name="m_address"/>
<variable messageType="xciNs2:xdo"name="m_second"/>
<variable messageType="xciNs1:xdo"name="m_address_state"/>
<variable messageType="xciNs2:xdo"name="m_second_state"/></variables><correlationSets>
<correlationSet name="XCI_Correlation"properties="tns:SessionId"/></correlationSets><sequence>
<pick createInstance="yes">
<onMessage operation="doProcess"partnerLink="xciApplicationPL"portType="xciNs3:xciApplication"variable="m_xciApplication">
<correlations>
<correlation set="XCI_Correlation"initiate="yes"/>
</correlations>
<scope variableAccessSerializable="no">
<variables>
<variable messageType="xciNs3:xdo"name="xciState"/>
</variables>
<sequence>
<switch name="methods">
<casecondition="bpws:getVariableData(′m_xciApplication′,′xdo′,′/xciNs3:xdo/ht:header/ht:method′)=′xciInit′">
<sequence>
<scopevariableAccessSerializable="no">
<variables></variables>
<sequence>
<assign>
<copy>
<fromvariable="m_xciApplication"/>
<tovariable="xciState"/>
</copy>
</assign>
<!--user defined code goes here by replace-->
<sequence>
<!--user defined code goes here-->
<empty/>
<!--user defined code ends here-->
</sequence>
<assign>
<copy>
<fromvariable="xciState"/>
<tovariable="m_xciApplication"/>
</copy>
</assign>
</sequence>
</scope>
<reply operation="doProcess"partnerLink="xciApplicationPL"portType="xciNs3:xciApplication"variable="m_xciApplication"/>
</sequence>
</case>
</switch>
</sequence>
</scope>
</onMessage>
</pick>
<assign>
<copy>
<from expression="true()"/>
<to variable="stillRunning"/>
</copy>
<copy>
<from expression="""/>
<to part="xdo"variable="m_address_state"query="xciNs1:xdo/ht:header/ht:method"/>
</copy>
<copy>
<from expression="""/>
<to part="xdo"variable="m_second_state"query="xciNs2:xdo/ht:header/ht:method"/>
</copy>
</assign>
<whilecondition="bpws:getVariableData(′stillRunning′)=true()">
<pick>
<onMessage operation="doProcess"partnerLink="addressPL"portType="xciNs1:address"variable="m_address"xmlns:ht="http://www.softwareag.com/xci/xciHeaderTrailer"xmlns:xo="http://www.softwareag.com/xci/wt/address">
<correlations>
<correlation set="XCI_Correlation"/>
</correlations>
<scope variableAccessSerializable="no">
<variables>
<variable messageType="xciNs1:xdo"name="xciState"/>
</variables>
<sequence>
<!--prepare State-->
<switch name="merge_state">
<casecondition="boolean(bpws:getVariableData(′m_address′,′xdo′,′/xciNs1:xdo/xciNs1:data/xciNs1:xciParameters′))">
<sequence>
<assign>
<copy>
<from part="xdo"query="/xciNs1:xdo/xciNs1:data/xciNs1:xciParameters"variable="m_address"/>
<to part="xdo"query="/xciNs1:xdo/xciNs1:data/xciNs1:xciParameters"variable="m_address_state"/>
</copy>
<copy>
<from part="xdo"query="/xciNs1:xdo/xciNs1:data/xciNs1:xciParameters"variable="m_address_state"/>
<to part="xdo"query="/xciNs1:xdo/xciNs1:data/xciNs1:xciParameters"variable="m_address"/>
</copy>
</assign>
</sequence>
</case>
</switch>
<switch name="merge">
<case
condition="boolean(bpws:getVariableData(′m_address_state′,′xdo′,′/xciNs1:xdo/xciNs1:data/xciNs1:xciParameters′))">
<sequence>
<empty name="merge"/>
<assign>
<copy name="clearPGVar">
<from part="xdo"query="/xciNs1:xdo/xciNs1:data/xciNs1:xciParameters[2]"variable="m_address"/>
<to part="xdo"query="/xciNs1:xdo/xciNs1:data/xciNs1:xciParameters[1]"variable="m_address"/>
</copy>
<copyname="clearPGStateVar">
<from part="xdo"query="/xciNs1:xdo/xciNs1:data/xciNs1:xciParameters[2]"variable="m_address_state"/>
<to part="xdo"query="/xciNs1:xdo/xciNs1:data/xciNs1:xciParameters[1]"variable="m_address_state"/>
</copy>
</assign>
</sequence>
</case>
</switch>
<!--end prepare State-->
<switch name="methods">
<otherwise>
<reply operation="doProcess"partnerLink="addressPL"portType="xciNs1:address"variable="m_address"/>
</otherwise>
<casecondition="bpws:getVariableData(′m_address′,′xdo′,′/xciNs1:xdo/ht:header/ht:method′)=′xciInit′">
<sequence>
<scopevariableAccessSerializable="no">
<variables></variables>
<sequence>
<assign>
<copy>
<fromvariable="m_address"/>
<tovariable="xciState"/>
</copy>
</assign>
<!--user defined code goes here by replace-->
<sequencename="Sequence">
<empty name="Empty"/>
</sequence>
<assign>
<copy>
<fromvariable="xciState"/>
<tovariable="m_address"/>
</copy>
</assign>
</sequence>
</scope>
<reply operation="doProcess"partnerLink="addressPL"portType="xciNs1:address"variable="m_address"/>
</sequence>
</case>
<casecondition="bpws:getVariableData(′m_address′,′xdo′,′/xciNs1:xdo/ht:header/ht:method′)=′onCheck′">
<sequence>
<scopevariableAccessSerializable="no">
<variables></variables>
<sequence>
<assign>
<copy>
<fromvariable="m_address"/>
<tovariable="xciState"/>
</copy>
</assign>
<!--user defined code goes here by replace-->
<sequencename="Sequence">
<assign>
<copy>
<fromexpression=second/>
<topart="xdo"query="/xo:xdo/ht:trailer/ht:navigation/ht:nextpage"variable="xciState"/>
</copy>
<copy>
<fromexpression=default/>
<topart="xdo"query="/xo:xdo/ht:trailer/ht:navigation/ht:mode"variable="xciState"/>
</copy>
</assign>
<empty name="Empty"/>
</sequence>
<assign>
<copy>
<fromvariable="xciState"/>
<tovariable="m_address"/>
</copy>
</assign>
</sequence>
</scope>
<reply operation="doProcess"partnerLink="addressPL"portType="xciNs1:address"variable="m_address"/>
</sequence>
</case>
</switch>
<assign>
<copy>
<from variable="m_address"/>
<to variable="m_address_state"/>
</copy>
</assign>
</sequence>
</scope>
</onMessage>
<onMessage operation="doProcess"partnerLink="secondPL"portType="xciNs2:second"variable="m_second"xmlns:ht="http://www.softwareag.com/xci/xciHeaderTrailer"xmlns:xo="http://www.softwareag.com/xci/wt/second">
<correlations>
<correlation set="XCI_Correlation"/>
</correlations>
<scope variableAccessSerializable="no">
<variables>
<variable messageType="xciNs2:xdo"name="xciState"/>
</variables>
<sequence>
<!--prepare State-->
<switch name="merge_state">
<casecondition="boolean(bpws:getVariableData(′m_second′,′xdo′,′/xciNs2:xdo/xciNs2:data/xciNs2:xciParameters′))">
<sequence>
<assign>
<copy>
<from part="xdo"query="/xciNs2:xdo/xciNs2:data/xciNs2:xciParameters"variable="m_second"/>
<to part="xdo"query="/xciNs2:xdo/xciNs2:data/xciNs2:xciParameters"variable="m_second_state"/>
</copy>
<copy>
<from part="xdo"query="/xciNs2:xdo/xciNs2:data/xciNs2:xciParameters"variable="m_second_state"/>
<to part="xdo"query="/xciNs2:xdo/xciNs2:data/xciNs2:xciParameters"variable="m_second"/>
</copy>
</assign>
</sequence>
</case>
</switch>
<switch name="merge">
<casecondition="boolean(bpws:getVariableData(′m_second_state′,′xdo′,′/xciNs2:xdo/xciNs2:data/xciNs2:xciParameters′))">
<sequence>
<empty name="merge"/>
<assign>
<copy name="clearPGVar">
<from part="xdo"query="/xciNs2:xdo/xciNs2:data/xciNs2:xciParameters[2]"variable="m_second"/>
<to part="xdo"query="/xciNs2:xdo/xciNs2:data/xciNs2:xciParameters[1]"variable="m_second"/>
</copy>
<copyname="clearPGStateVar">
<from part="xdo"query="/xciNs2:xdo/xciNs2:data/xciNs2:xciParameters[2]"variable="m_second_state"/>
<to part="xdo"query="/xciNs2:xdo/xciNs2:data/xciNs2:xciParameters[1]"variable="m_second_state"/>
</copy>
</assign>
</sequence>
</case>
</switch>
<!--end prepare State-->
<switch name="methods">
<otherwise>
<reply operation="doProcess"partnerLink="secondPL"portType="xciNs2:second"variable="m_second"/>
</otherwise>
<casecondition="bpws:getVariableData(′m_second′,′xdo′,′/xciNs2:xdo/ht:header/ht:method′)=′xciInit′">
<sequence>
<scopevariableAccessSerializable="no">
<variables></variables>
<sequence>
<assign>
<copy>
<fromvariable="m_second"/>
<tovariable="xciState"/>
</copy>
</assign>
<!--user defined code goes here by replace-->
<sequencename="Sequence">
<empty name="Empty"/>
</sequence>
<assign>
<copy>
<fromvariable="xciState"/>
<tovariable="m_second"/>
</copy>
</assign>
</sequence>
</scope>
<reply operation="doProcess"partnerLink="secondPL"portType="xciNs2:second"variable="m_second"/>
</sequence>
</case>
</switch>
<assign>
<copy>
<from variable="m_second"/>
<to variable="m_second_state"/>
</copy>
</assign>
</sequence>
</scope>
</onMessage>
<onMessage operation="doProcess"partnerLink="xciApplicationPL"portType="xciNs3:xciApplication"variable="m_xciApplication">
<correlations>
<correlation set="XCI_Correlation"/>
</correlations>
<scope variableAccessSerializable="no">
<variables>
<variable messageType="xciNs3:xdo"name="xciState"/>
</variables>
<sequence>
<switch name="methods">
<casecondition="bpws:getVariableData(′m_xciApplication′,′xdo′,′/xciNs3:xdo/ht:header/ht:method′)=′xciTerminate′">
<sequence>
<scopevariableAccessSerializable="no">
<variables></variables>
<sequence>
<assign>
<copy>
<fromvariable="m_xciApplication"/>
<tovariable="xciState"/>
</copy>
</assign>
<!--user defined code goes here by replace-->
<sequence>
<!--user defined code goes here-->
<empty/>
<!--user defined code ends here-->
</sequence>
<assign>
<copy>
<fromvariable="xciState"/>
<tovariable="m_xciApplication"/>
</copy>
</assign>
</sequence>
</scope>
<reply operation="doProcess"partnerLink="xciApplicationPL"portType="xciNs3:xciApplication"variable="m_xciApplication"/>
</sequence>
</case>
</switch>
<assign>
<copy>
<from expression="false()"/>
<to variable="stillRunning"/>
</copy>
</assign>
</sequence>
</scope>
</onMessage></pick></while></sequence></process>.
權(quán)利要求
1.一種用于構(gòu)造包含多個(gè)web服務(wù)(30)的應(yīng)用的應(yīng)用構(gòu)架,包括a.布局編輯器,其適合于創(chuàng)建包含多個(gè)頁面(10)的應(yīng)用的圖形用戶界面,每個(gè)頁面(10)包含至少一個(gè)元素(11),用于與用戶交互以生成或修改數(shù)據(jù)集合(41);b.控制層編輯器,其適合于針對所述圖形用戶界面的每個(gè)頁面(10)創(chuàng)建接收和處理與各個(gè)頁面(10)相關(guān)的數(shù)據(jù)集合的相應(yīng)代碼段(50);以及c.生成器(100),該生成器從所述多個(gè)代碼段(50)中生成組織序列(80),其中由引擎(110)對所述組織序列(80)的處理包含調(diào)用所述多個(gè)web服務(wù)(30)。
2.如權(quán)利要求1所述的應(yīng)用構(gòu)架,還適合于創(chuàng)建每個(gè)代碼段(50),以使得其經(jīng)由web服務(wù)接口接收所述數(shù)據(jù)集合(41)。
3.如權(quán)利要求2所述的應(yīng)用構(gòu)架,其中所述web服務(wù)接口的接口定義包括由各個(gè)頁面調(diào)用的至少一個(gè)函數(shù)和所述數(shù)據(jù)集合(41)的XML模式定義,尤其是web服務(wù)定義(42)。
4.如權(quán)利要求3所述的應(yīng)用構(gòu)架,還適合于針對所述布局編輯器中創(chuàng)建的每個(gè)頁面(10),自動得到所述XML模式定義和至少一個(gè)web服務(wù)定義。
5.如前述權(quán)利要求中任意一個(gè)所述的應(yīng)用構(gòu)架,其中所述控制層編輯器適合于創(chuàng)建代碼段(50)作為以商業(yè)流程執(zhí)行語言實(shí)現(xiàn)的段,并且其中所述組織序列(80)是商業(yè)流程執(zhí)行語言序列,該序列可以被商業(yè)流程執(zhí)行語言引擎(110)處理。
6.如前述權(quán)利要求中任意一個(gè)所述的應(yīng)用構(gòu)架,其中每個(gè)代碼段(50)包括多個(gè)方法段(51),每個(gè)方法段(51)對應(yīng)于在所述圖形用戶界面的各個(gè)頁面(10)上生成的一個(gè)函數(shù)調(diào)用。
7.如權(quán)利要求6所述的應(yīng)用構(gòu)架,其中當(dāng)處理從所述圖形用戶界面的頁面(10)發(fā)送的請求時(shí),利用所述應(yīng)用構(gòu)架構(gòu)造的應(yīng)用執(zhí)行以下步驟-選擇適當(dāng)?shù)拇a段(50);-利用所述請求中包含的數(shù)據(jù)集合填充狀態(tài)變量(41);-選擇所述代碼段(50)的適當(dāng)?shù)姆椒ǘ?51);-執(zhí)行該方法段(51),所述執(zhí)行包含調(diào)用至少一個(gè)web服務(wù)(30);-將更新后的狀態(tài)變量(41)發(fā)送回所述圖形用戶界面的頁面(10)。
8.如前述權(quán)利要求中任意一個(gè)所述的應(yīng)用構(gòu)架,其中,處理所述利用所述應(yīng)用構(gòu)架構(gòu)造的應(yīng)用的組織序列(80)包括保持對象狀態(tài)(41)和基于一個(gè)或多個(gè)代碼段(50)中定義的操作來處理所述狀態(tài)。
9.如權(quán)利要求8所述的應(yīng)用構(gòu)架,其中處理所述狀態(tài)包括將所述對象轉(zhuǎn)換成適合于web服務(wù)(30)的格式,執(zhí)行所述web服務(wù)(30)以及將所述web服務(wù)的響應(yīng)轉(zhuǎn)換回所述對象的初始格式。
10.如權(quán)利要求9所述的應(yīng)用構(gòu)架,其中所述對象包括遵循XSD的XML數(shù)據(jù)(41)并且其中所述轉(zhuǎn)換是利用作為web服務(wù)封裝的XSLT來執(zhí)行的。
11.利用如權(quán)利要求1到10中任意一個(gè)所述的應(yīng)用構(gòu)架來構(gòu)造包含多個(gè)web服務(wù)(30)的應(yīng)用的方法。
12.利用如權(quán)利要求1到10中任意一個(gè)所述的應(yīng)用構(gòu)架構(gòu)造的應(yīng)用。
13.包含如權(quán)利要求1到10中任意一個(gè)所述的應(yīng)用構(gòu)架的數(shù)據(jù)載體。
全文摘要
本發(fā)明涉及一種用于構(gòu)造包含多個(gè)web服務(wù)(30)的應(yīng)用的應(yīng)用構(gòu)架。該應(yīng)用構(gòu)架包括布局編輯器,其適合于創(chuàng)建包含多個(gè)頁面(10)的應(yīng)用的圖形用戶界面,每個(gè)頁面(10)包含至少一個(gè)元素(11),用于與用戶交互以生成或修改數(shù)據(jù)集合(41);控制層編輯器,其適合于針對所述圖形用戶界面的每個(gè)頁面(10)創(chuàng)建接收和處理與各個(gè)頁面(10)相關(guān)的數(shù)據(jù)集合的相應(yīng)代碼段(50);以及生成器(100),該生成器從所述多個(gè)代碼段(50)中生成組織序列(80),其中由引擎(110)對所述組織序列(80)的處理包含調(diào)用所述多個(gè)web服務(wù)(30)。
文檔編號G06F9/44GK101030138SQ20071007994
公開日2007年9月5日 申請日期2007年2月27日 優(yōu)先權(quán)日2006年2月27日
發(fā)明者凱·溫克爾, 克里斯蒂娜·佐蒙曼, 雨朵·哈非曼, 比約恩·米勒, 于爾根·哈巴斯 申請人:軟件股份公司