使用Taskflow Router进行有条件的Taskflow导航

JDev Ver. 11.1.1.2.0
DB Ver. Oracle 10g(XE)

本文示例使用taskflow中的Router进行有条件的导航。使用Oracle实例Schema HR中的EMPLOYEES表进行实现。

示例代码下载

首先创建ADF应用,及构建EMPLOYEE表的model部分(EO、VO、AM),这里不再赘述。

创建页面MainPage,布局如下截图所示。
本Demo目标为在点击左侧table中action链接时根据当前行雇员salary决定右侧页面显示内容。其中MainPage中PanelSplitter, Table, Link 等创建过程略去。

1. 创建两个jsff页面,分别对应Salary大于10000及小于等于10000的情况,显示UPPER/LOWER。

2. 创建bounded taskflow,在Overview页面的Parameters中为其添加变量名为SalaryStatus,并勾选Required。注意这里IDE自动生成了表达式为#{pageFlowScope.SalaryStatus}的变量。

3. 在
taskflow的Diagram中首先拖放Router(Component Palette ->
router),它将作为该bounded taskflow的Default
Activity。接着将Upper.jsff及Lower.jsff拖入taskflow,并以Control Flow Case
(Component Palette -> Control Flow
Case)进行连接,分别将连接命名为toUpper,toLower。拖放TaskFlowReturn(Component Palette
-> Task Flow Return),并以Comtrol Flow
Case进行连接,命名为default,它将作为router的默认导航结果。

4. 点击router1,在Property Inspectory中设置Default Outcome为default,并创建表达式,设定
#{pageFlowScope.SalaryStatus > 10000}时OutputCome为toUpper,
#{pageFlowScope.SalaryStatus <= 10000}时OutputCOme为toLower

5. 为
MainPage.jspx设定绑定变量,在MainPage.jspx的binding页面中右键点击executable中的variables,选
择insert inside variables ->
variable,Name为salary,Type为java.lang.String,创建的变量可在Structure面板中看到。点击
Bindings上的加号添加类型为AttributeValues类型的绑定,名称为salary1,使其指向刚刚创建的salary变量。再为
Bindings添加另一AttributeValue使其指向EmployeesView1Iterator中Salary字段,名为Salary。

6. 将
第2步创建的bounded
taskflow拖入MainPage右侧区域,在弹出菜单中选择Region。由于taskflow中设定了required变量
SalaryStatus,需要为其设定表达式为#{bindings.salary1.inputValue}。
7. 设置MainPage左侧区域表格中action Link的Action Listener,使其调用BackingBean方法以将第五步创建的Salary值设置入salary1,并执行MainPage右侧区域region的refresh方法,具体代码如下
(需要将右侧区域的region绑定入BackingBean)
FacesContext fc = FacesContext.getCurrentInstance();
Application app = fc.getApplication();

// get current row Salary value
Number salary = (Number)app.evaluateExpressionGet(fc, "#{bindings.Salary.inputValue}", Object.class);

// set salary value to salary1 to effort in taskflow

FacesCtrlAttrsBinding salary1 =
(FacesCtrlAttrsBinding)app.evaluateExpressionGet(fc,
"#{bindings.salary1}", Object.class);
salary1.setAttributeValue(salary.toString());

// refresh region on the right side of MainPage
this.region1.refresh(fc);

示例代码下载

参考OTN Oracle Magazine January/February 2010, The Route to Success