2010年4月25日星期日

ADF_083:Task Flow使用指南之二:传递参数给Task Flow(2)

本文最后一次修改时间:2012-03-05。
开发环境:JDevloper 11.1.2.1.0+ Oracle Database 10g Express Edition 10.2.0.1。

本实验实现如下场景:
在Department页面,选中一个部门后,传递DepartmentId给Employee TaskFlow,从而显示该Department下的员工。
这里使用ADF-BC方式默认创建了Department和Employee的EO和VO,然后修改EmployeeView,添加一个Where子句:WHERE Employees.DEPARTMENT_ID = :bv_departmentId。

1. 为了对比开发效果,我这里使用了两种实现方式
(1)在adfc-config.xml中分别创建两组:各自的页面+各自的TaskFlow。

(2)方式一:使用了method节点:ExecuteWithParams,这是ADF推荐的实现方式。

(3)方式二:没有使用method节点,而是在页面中调用ExecuteWithParams。


2. 方式一和方式二的页面department.jsf和department2.jsf代码完全一样。
都是点击DepartmentId链接后,传递departmentId到requestScope中,
<af:commandLink text="#{row.DepartmentId}" id="cl1" action="toEmployees">
<af:setPropertyListener from="#{row.DepartmentId}" to="#{requestScope.deptId}" type="action"/>
</af:commandLink>
使用RequestScope的原因是遵循变量范围最小够用原则。
重要说明:
这里其实还是应该设置成pageFlowScope,具体说明请参考《使用Bounded Task Flow、Region和Router》。

3. 方式一:实现employees-taskflow。
(1)双击打开employees-taskflow定义,点击空白处,设置其输入参数:
在这里定义的输入参数会自动放到pageFlowScope中!
相关的文档说明我没有找到,是在实验中发现的:增加新的变量后,所有的EL编辑框的下拉列表中的pageFlowScope节点下会出现这个变量。
重要说明:
这里其实还是应该获取来自pageFlowScope的变量,具体说明请参考《使用Bounded Task Flow、Region和Router》。


(2)双击打开adfc-config定义,选中employees-taskflow Call,设置其输入参数:
说明:这里的定义要与上一步保持一致。
不知道为啥要定义两次。我感觉是因为这里有其它的参数,如Pass By Value,所以需要再定义一次。

(3)设置ExecuteWithParams节点
这里我使用#{requestScope.deptId}作为参数值,之所以不使用#{pageFlowScope.ip_departmentId},是因为测试结果显示#{pageFlowScope.ip_departmentId}返回值为空。
也就是说taskFlow的inputParameter没有起到预想的作用,原因尚未查明。
没办法,只好另想办法:因为可以读取到requestScope中的变量,所以就使用了#{requestScope.deptId}。
重要说明:
原因已经查明,TaskFlow的输入参数必须使用pageFlowScope,具体说明请参考《使用Bounded Task Flow、Region和Router》。


(4)运行页面department.jsf,效果和预想的一样。

4. 方式二:实现employees2-taskflow。
(1)在employee2.jsf页面装载时,会调用方法ExecuteWithParams。
具体实现方式请参考《使用ADF-BC 实现查询功能之三:如何在页面装载时自动执行查询?》。
(2)为employee2.jsf页面设置Page Parameter:

说明:From Value来自requestScope.deptId,To Value是要在employee2-taskflow中要用到的参数pageFlowScope.departmentId。
(3)那么,在本例中,哪里使用了参数pageFlowScope.departmentId呢?
在employee2.jsf页面中Binding的ExecuteWithParams方法的参数中使用了pageFlowScope.departmentId。
当然,这里我们依然可以使用requestScope.deptId,但是为了能够让taskFlow中其它页面也使用该变量,还是将其复制到了pageFlowScope中。
也就是说,这里是通过设置TaskFlow中的默认页面的Page Parameter把参数传进来。
而不是通过taskFlow的inputParameter传递参数,因为taskFlow的inputParameter没有起到预想的作用,原因待查。

(4)运行department2.jsf,效果和方式一应该一样。

参考文献:
1. http://andrejusb.blogspot.com/2007/12/jdeveloper-11g-and-adf-task-flow.html

Project 下载:ADF_TaskFlow_InputParam.7z

没有评论: