使用 BPEL 映射器编辑 BPEL 流程
最新更新日期:2006 年 12 月 15 日
撰稿人:Victoria Zhukovskaya,修订人:Irina Filippova
本教程向您介绍如何使用 BPEL 映射器处理 XPath 表达式。BPEL 映射器是 NetBeans Enterprise Pack 中 BPEL 设计器功能的组件。使用强大的 BPEL 映射器功能,您可以处理谓词、使用 XPath 函数并可在一个业务流程内复制变量。
利用 BPEL 映射器,您可以添加和编辑针对某些业务流程元素(如 Assign、If、If 中的 ElseIf 元素、ForEach、RepeatUntil、While 和 Wait)的函数。每个元素都具有特定的表达式类型,如复制分配、条件表达式和时间函数等。例如,If、If 中的 ElseIf 元素以及 RepeatUntil 活动可以具有条件表达式;Assign 元素可以包括复制表达式;Wait 元素可以具有持续时间表达式;ForEach 活动可以具有包含整数值的表达式。使用 BPEL 映射器的图形界面,您还可以执行计算,具体方法是:向变量和 XSD 元素、属性及部件指定 XPath 运算和函数。
先决条件
要了解本教程,您需要具备 SOA 技术和 NetBeans IDE 的一些基本知识或编程经验。
系统要求
本教程假定您的系统满足 NetBeans Enterprise Pack 5.5 发行说明的“系统要求”主题中指定的要求。
本教程所需的软件
在开始之前,您必须在计算机中安装以下软件:
- 包含 NetBeans Enterprise Pack 5.5 的 NetBeans IDE 5.5(下载)
目录
返回页首
配置教程环境
在部署应用程序之前,必须正确配置 Sun Java System Application Server 和 JBI 运行环境,并且使它们处于运行状态。
请参见简单的同步 BPEL 流程教程中的“配置教程环境”部分,了解如何启动应用服务器。
返回页首
创建 SynchronousSample 项目
在本教程中,您将使用“同步 BPEL 流程”样例项目。
- 从 IDE 的主菜单中,选择“文件”>“新建项目”。
- 在“类别”列表中,展开“样例”节点,然后选择“面向服务的体系结构”节点。
- 在“项目”列表中,选择“同步 BPEL 流程”。
- 单击“下一步”。
- 接受缺省的项目名称 SynchronousSample 和项目位置值,或者根据需要更改这些值。
- 单击“完成”。
现在,“项目”窗口会包含两个项目节点:一个是标记为 SynchronousSample 的 BPEL 模块项目节点,另一个是标记为 SynchronousSampleApplication 的复合应用程序项目节点。
返回页首
浏览“BPEL 映射器”窗口
- 在“项目”窗口中,展开 "SynchronousSample" 项目节点和“流程文件”节点。
- 双击 "SynchronousSample.bpel" 文件。
IDE 将打开 BPEL 文件的“设计”视图。
- 在图中,选择 "Assign1" 元素。
在 IDE 底部,将会打开 "Assign1" 元素的“BPEL 映射器”窗口。
- 展开位于“BPEL 映射器”窗口左侧的 "inputVar" 节点和右侧的 "outputVar" 节点。
请注意,对于 "Assign1" 元素来说,其输入参数的值将被复制到输出参数。

单击以放大
我们查看一下复制操作的源代码。要查看源代码,请在图中右键单击 "Assign1" 元素,然后从弹出式菜单中选择“转至源”。
在“源”视图中,您会看到以下代码,这些代码实现了将输入 "paramA" 的值复制到输出 "paramA" 中。
<copy>
<from>$inputVar.inputType/paramA</from><to>$outputVar.resultType/paramA</to>
</copy>
通过执行以下步骤,从“BPEL 映射器”窗口删除该操作:
- 单击“设计”标签打开“设计”视图,然后在图中选择 "Assign1" 元素。
- 在“BPEL 映射器”窗口中,单击连接输入和输出参数的线段,然后按 Delete 键。
在“源”视图中,您会看到代码已不再包含复制操作:<assign name="Assign1"></assign>
- 单击“保存”。
返回页首
使用 BPEL 映射器编辑同步 BPEL 项目
下面的示例说明了如何使用 "current-date" 函数以及字符串函数 "concat" 和 "substring"。您还将使用字符串型和数值型函数,并了解如何使用 "count" 和 "last" 等节点集函数。此外,这些示例也说明了 "sum" 和 "equal" 运算的用法。
最后,您将创建两个测试用例以测试修改后的业务流程:
- 对于测试用例 0,输入参数可以是任何字符串和测试数值,输出则是包含当前日期和时区的字符串。
- 对于测试用例 1,输入参数可以是测试数值和节点集,输出则是包含元素数目、元素数目的总和以及最后一个元素的字符串。
添加变量
在此过程中,您将向业务流程添加 "todayIs" 变量(字符串类型)。此变量用于存储 "current-date" 函数返回的值。
- 如果在 IDE 中未打开 "SynchronousSample.bpel" 文件,请立即将其打开。
- 在“设计”视图中,右键单击 SynchronousSample 流程元素,然后选择“添加”>“变量”。
- 在“名称”字段中,输入 "todayIs"。
- 展开“内置类型”节点,然后选择 "string" 类型。
- 单击“确定”。
在图中选择 "Assign1" 元素。现在,"todayIs" 变量已显示在“BPEL 映射器”窗口的两个树窗格中。
修改 XML 架构
在此过程中,您将修改现有 XML 架构元素的属性,并添加新的 "nTest" 元素。"nTest" 元素用于定义将要执行的 If 分支。稍后,您将在测试用例中使用 "nTest" 元素。
- 在“项目”窗口中,展开 "SynchronousSample" 项目节点和“流程文件”节点。
- 双击 "SynchronousSample.xsd" 节点。
IDE 将打开 XML 架构文件的“架构”视图。
- 在“架构”视图列中,选择“复杂类型”> "simpleProcess" > "sequence" > "paramA"。
您可以单击列按钮
以确保视图处于列模式。
- 在“属性”窗口中,将“最大出现次数”参数设置为 "unbounded" 以允许使用大于或等于 1 的值。
如果尚未打开“属性”窗口,请选择“窗口”>“属性”或者按 Ctrl-Shift-7 组合键。

单击以放大
- 在“架构”视图的第三列上,右键单击 "sequence" 元素,然后从弹出式菜单中选择“添加”>“元素”。
- 在“元素”对话框的“名称”字段中,输入 "nTest",然后选择“使用现有类型”选项。
- 展开“内置类型”节点,然后选择 "int" 类型。
- 单击“确定”。

单击以放大
- 选择“文件”>“全部保存”。
编辑 BPEL 流程
在此过程中,您将向业务流程添加 If 和 Assign 活动。
- 如果在 IDE 中未打开 "SynchronousSample.bpel" 文件,请立即将其打开。
- 在“设计”视图中,选择组件面板上的 "If" 图标,将所选组件拖到设计区域中,并将其放在图的 "start" 和 "Assign1" 元素之间。
- 将 "Assign1" 元素移入 If1 元素,并将其放在主分支上(没有斜杠)。
- 在组件面板上,选择“分配”图标,并将其放在 If 元素中 "Assign1" 元素之后。
此元素标记为 "Assign2"。
- 右键单击 If 元素,然后从弹出式菜单中选择“添加 Else If”。
- 在组件面板上,选择“分配”图标,并将其放在 ElseIf 分支中的图上。
此元素标记为 "Assign3"。
请参见下图以验证您的业务流程图是否与此图类似。

单击以放大
在 If 元素中添加条件
按照以下步骤,您可以指定执行 If 活动的条件。"nTest" 参数定义了值为 true 的 If 分支。对于 If 分支,"nTest" 等于 1,对于 ElseIf 分支,"nTest" 等于 2。
为 "If1" 元素指定条件:
- 在图中选择 "If1" 元素。
- 在“BPEL 映射器”窗口中的菜单栏上,选择“数值”> "Number Literal" 和“运算符”> "EQUAL"。
映射窗格中会出现两个函数框。为方便起见,请拖动函数框将 "Number Literal" 框放在左侧,"EQUAL" 函数框放在右侧。
- 在“BPEL 映射器”窗口的左侧树窗格中,展开 "inputVar" 和 "inputType" 节点。
- 在左侧树窗格中选择 "nTest" 节点,然后将指针拖到 EQUAL 函数框中的 "any1" 参数。
- 在 "Number Literal" 函数框中,双击输入字段并输入 1。
- 选择 "Number Literal" 函数框,然后将指针拖到 EQUAL 函数框中的 "any2" 参数。
- 在 EQUAL 函数框中,选择 "return boolean" 参数,然后将指针拖到“BPEL 映射器”窗口右侧树窗格中的“结果”节点。
- 选择“文件”>“保存”。

单击以放大
为 "ElseIf" 元素指定条件:
- 在图中选择 "ElseIf" 元素。
- 请重复前面的过程中对 If 元素执行的步骤,但输入 2 作为 "Number Literal" 的值。

单击以放大
在 Assign 元素中添加表达式
在此过程中,您将使用源代码编辑器和 BPEL 映射器向 "Assign1"、"Assign2" 和 "Assign3" 元素添加表达式。
将表达式添加到 "Assign1" 元素中:
- 在图中选择 "Assign1" 元素。
- 在“BPEL 映射器”窗口中的菜单栏上,选择“日期时间”> "Current Date"。
"Current Date" 函数框会出现在映射窗格中。
- 在 "Current Date" 函数框中,选择 "return string" 参数,然后将指针拖到“BPEL 映射器”右侧树窗格中的 "todayIs" 节点上。
- 选择“文件”>“保存”。

单击以放大
- 在图中右键单击 "Assign1" 元素,然后从弹出式菜单中选择“转至源”。
在“源”视图中,"Assign1" 元素的 "copy" 运算符将 "return string" 参数的值复制到 "todayIs",如下所示:
<assign name="Assign1">
<copy>
<from>current-date()</from>
<to variable="todayIs"/>
</copy>
</assign>
将表达式添加到 "Assign2" 元素中:
"Assign2" 元素将构成以下输出字符串:"Hello!Today is 2006-11-17. Time zone is 03:00."
您需要按照以下格式使用包含当前日期的 "todayIs" 变量:"YYYY-MM-DD ZZ:ZZ",其中,"YYYY" 是当前年份,"MM" 是月份,"DD" 是日期,"ZZ:ZZ" 为时区。
- 在图中选择 "Assign2" 元素。
- 在“BPEL 映射器”窗口中的菜单栏上,选择“字符串”> "Concat",然后选择两次“字符串”> "Substring"。
映射窗格中会出现三个函数框。为方便起见,请将两个 "Substring" 框拖到左侧,将 "Concat" 框拖到右侧。
- 要通过 "todayIs" 变量构成只包含日期而不包含时区的字符串,请完成以下步骤:
- 在左侧树窗格中选择 "todayIs" 节点,然后将指针拖到第一个 Substring 函数框中的 "string" 参数。
- 在函数框中双击 "number",然后键入 "1"。
这是将要复制的 "todayIs" 字符串的起始位置。
- 在函数框中双击 "number?",然后键入 "10"。
这是将要复制的符号数。
- 要通过 "todayIs" 变量构成只包含时区而不包含日期的字符串,请完成以下步骤:
- 在左侧树窗格中选择 "todayIs" 节点,然后将指针拖到第二个 Substring 函数框中的 "string" 参数。
- 在函数框中双击 "number",然后键入 "11"。
这是将要复制的 "todayIs" 字符串的起始位置。
注意:这里 "number?" 不是 Substring 函数的必需参数:当不指定参数时,Substring 函数会将字符串从起始位置复制到字符串结束。
- 要构成本部分开始时提及的输出 Concat 字符串,请完成以下步骤:
- 在“BPEL 映射器”窗口的左侧树窗格中,展开 "inputVar" 和 "inputType" 节点。
- 在左侧树窗格中选择 "paramA" 节点,然后将指针拖到 Concat 函数框中的 "string1" 参数。
这样会复制输入参数中的字符串。
- 在 Concat 函数框中双击 "string2",然后键入 "Today is"。
这是为了构成用于输出的字符串,此字符串将会添加到输出字符串中。
- 在第一个 Substring 函数框中,选择 "return string" 参数,然后将指针拖到 Concat 函数框的 "string3"。
这样会复制当前的日期而不包含时区。
- 在 Concat 函数框中双击 "string4",然后键入 ".Time zone is"。
此字符串将位于当前日期之后。
- 在第二个 Substring 函数框中,选择 "return string" 参数,然后将指针拖到 Concat 函数框的 "string5"。
这样会复制时区而不包含当前日期。
- 在 Concat 函数框中双击 "string6",然后键入 "."。
此字符串会添加到时区之后。
- 在“BPEL 映射器”窗口的右侧树窗格中,展开 "outputVar" 和 "resultType" 节点。
- 在 Concat 函数框中,选择 "return string" 参数,然后将指针拖到“BPEL 映射器”窗口右侧树窗格中的 "paramA" 节点。
这样会将 Concat 函数的结果复制到输出。
- 选择“文件”>“保存”。

单击以放大
- 在图中右键单击 "Assign2" 元素,然后从弹出式菜单中选择“转至源”。
在“源”视图中,"Assign2" 元素的 "copy" 运算符会形成包含当前日期和时区的字符串,如下所示:
<assign name="Assign2">
<copy>
<from>concat($inputVar.inputType/ns0:paramA, ' Today is ', substring($todayIs, 1, 10), '. Time zone is ', substring($todayIs, 11), '.')</from>
<to>$outputVar.resultType/ns0:paramA</to>
</copy>
</assign>
将表达式添加到 "Assign3" 元素中:
您将使用源代码编辑器为 "Assign3" 元素添加表达式。
注意:如有必要,您可以在使用源代码编辑器添加表达式后,在 BPEL 映射器中编辑该元素。
- 在 BPEL 图中右键单击 "Assign3" 元素,然后从弹出式菜单中选择“转至源”。
- 使用以下内容替换 <assign name="Assign3"/> 字符串:
<assign name="Assign3">
<copy>
<from>concat('There are/is ', count($inputVar.inputType/ns0:paramA), ' element(s) in nodeset.', 'Sum of element(s) is ', sum($inputVar.inputType/ns0:paramA), '. Last element is ', $inputVar.inputType/ns0:paramA[last()], '.')</from>
<to>$outputVar.resultType/ns0:paramA</to>
</copy>
</assign>
- 选择“文件”>“保存”。
- 单击编辑器工具栏中的“设计”按钮切换到“设计”视图,然后在“BPEL 映射器”窗口中查看结果。
- 在 BPEL 图中选择 "Assign3" 元素。

单击以放大
"Assign3" 元素的表达式会显示复制到 "paramA" 的节点数,计算所有节点的总和,并提供最后一个节点的值。将输出以下样例字符串:"There are/is 3 element(s) in nodeset.Sum of element(s) is 6. Last element is 3."
返回页首
将项目部署到应用服务器上
开始测试您的业务流程之前,需要将“BPEL 模块”项目添加为 JBI 模块,并将其部署到应用服务器上。
要执行此操作,请按照简单的同步 BPEL 流程教程中“将项目部署到应用服务器上”部分所述的步骤。
返回页首
创建测试用例
要测试修改后的 BPEL 流程,请创建以下步骤所描述的测试用例("TestCase0" 和 "TestCase1")。对于 "TestCase0",输入参数是用于测试的字符串和数字,输出是包含当前日期和时区的字符串。对于 TestCase1,输入参数是测试数字和节点集,输出是包含元素数目、元素数目的总和及最后一个元素的字符串。
创建 "TestCase0":
- 在“项目”窗口中,依次展开 "SynchronousSampleApplication"、“测试”和 "TestCase0" 节点。"TestCase0" 节点包含了以下两个 XML 文件:“输入”(输入文件)和“输出”(输出文件)。
- 双击“输入”文件节点,然后使用以下内容替换缺省内容:
<soapenv:Envelope xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:syn="http://xml.netbeans.org/schema/SynchronousSample">
<soapenv:Body>
<syn:typeA>
<syn:paramA>Hello!</syn:paramA>
<syn:nTest>1</syn:nTest>
</syn:typeA>
</soapenv:Body>
</soapenv:Envelope>
在此测试中,输入参数是测试数字 (1) 和字符串 "Hello!"
- 双击 TestCase0 节点下的“输出”文件节点。
- 删除“输出”文件中的缺省文本。
创建 "TestCase1":
- 在“项目”窗口中,展开 "SynchronousSampleApplication" 项目节点,右键单击“测试”节点,然后从弹出式菜单中选择“新建测试用例”。
将打开“新建测试用例”向导。
- 保留名称 "TestCase1",然后单击“下一步”。
- 展开“SynchronousSample - 流程文件”,选择 "SynchronousSample.wsdl",然后单击“下一步”。
- 选择 "operation1",然后单击“完成”。
- 在“测试”节点下,展开 "TestCase1" 节点,然后双击“输入”。
- 将缺省内容替换为以下内容:
<soapenv:Envelope xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/
http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:syn="http://xml.netbeans.org/schema/SynchronousSample">
<soapenv:Body>
<syn:typeA>
<syn:paramA>1</syn:paramA>
<syn:paramA>2</syn:paramA>
<syn:paramA>3</syn:paramA>
<syn:nTest>2</syn:nTest>
</syn:typeA>
</soapenv:Body>
</soapenv:Envelope>
在此测试中,输入参数是三个节点:1、2、3,测试数字为 2。
- 双击 "TestCase1" 节点下的“输出”文件节点,然后删除此文件中的缺省文本。
- 选择“文件”>“全部保存”来保存所做的更改。
返回页首
测试应用程序
执行测试用例:
- 在“项目”窗口中,右键单击 "SynchronousSampleApplication" 项目节点,然后从弹出式菜单中选择“测试项目”。
- 因为初次执行时“输出”文件为空,请单击两个对话框中的“是”,以同意覆盖空输出。
- 请注意测试失败的消息。这是一个特例,因为在初次运行过程中 "Output.xml" 为空,而输出会写入到输出文件中。
- 重复执行步骤 1。
- 查看测试已成功通过的消息。
您可以打开每个测试用例的 "Output.xml" 文件,检查测试结果。
对于 "TestCase0","Output.xml" 文件包含显示当前日期和时区的字符串,例如 "Hello!Today is 2006-11-17. Time zone is 03:00."
对于 "TestCase1","Output.xml" 文件包含以下字符串:"There are/is 3 element(s) in nodeset.Sum of element(s) is 6. Last element is 3."
返回页首
小结
在本教程中,您了解了 NetBeans Enterprise Pack 中 BPEL 设计器的 BPEL 映射器组件;并且修改了样例同步应用程序项目,同时使用 BPEL 映射器功能向业务流程添加了表达式和函数;此外,您还测试了应用程序,并验证了表达式是否返回有效值。
返回页首