2012年8月8日星期三

ADF_192:Task Flow使用指南之七:SavePoints(1)

运行环境:JDeveloper 11.1.1.1.6 + Oracle Database 10g Express Edition 10.2.0.1。

ADF TaskFlow 有一个非常棒的特性:SavePoints。该特性特别适合如下情景:
(1)大表单的填写(表单项非常多,表单项之间检验逻辑复杂)
(2)多表单的填写,这些表单必须在一个事务中。
以上两种情况都要求用户一次填写成功并提交,这其实很难做到,因为在实际使用中经常遇到很多意外情况,比如:
(1)用户填写了一半,中间被领导叫去做其他事,回来时,发现Session超时,只好重填。
(2)填写完毕提交时出现异常,所有的表单项都被清空了,只好重填。

有一个概念必须要首先澄清:SavePoints相当于给TaskFlow的状态做一个快照,与Transaction没有关系。
做了快照的数据并没有提交到数据库中,反过来,Commit或Rollback事务之后,之前做的快照也就没有用了。
换句话说,SavePoints是在事务完成之前“暂存”的一些快照,你可以根据逻辑会退到某一个快照。

在这个实验中,首先介绍如何使用Explicit SavePoints,即显式SavePoints。
重要步骤说明:

1. 修改adf-config.xml,增加如下内容

<adf-controller-config xmlns="http://xmlns.oracle.com/adf/controller/config">
<savepoint-datasource>java:comp/env/jdbc/HRConnDS</savepoint-datasource>
<savepoint-expiration>86400</savepoint-expiration>
<enable-implicit-savepoints>false</enable-implicit-savepoints>
</adf-controller-config>

说明:
(1)快照数据是保存在数据库中,因此需要给一个数据库连接,运行时会创建表ORADFCSAVPT,并写入数据。
(2)默认情况下,快照的数据保存24个小时,即86400秒。
(3)之所以使用JDeveloper 11.1.1.1.6而没有使用11.1.2.2,是因为在配置adf-config.xml时,发现JDeveloper11.1.2.2无法解析adf-controller-config,应该是个BUG。

2. 设计 TaskFlow
(1)基本功能
从BrowseEmployee页面到EditEmployee页面之前创建一份快照,修改后返回到BrowseEmployee页面。
用户可以选择Undo,即使用savePointRestore Activity恢复到快照时的状态。

(2)创建快照使用的是Method Activity
其中的Method属性值为#{controllerContext.savePointManager.createSavePoint}。
ReturnValue保存在#{pageFlowScope.savePointId}中。

(3)恢复快照使用的是savePointRestore Activity
其中的Save Point ID属性值为#{pageFlowScope.savePointId},即最后一个创建的快照ID。

(4)BrowseEmployee页面

(5)EditEmployee TaskFlow

(6)EditEmployee页面


3. 运行
(1)点击Edit Employee按钮

(2)修改一些信息

(3)发现数据已经修改了,点击Undo Last Change

(4)发现数据改回去了

(5)查看数据库表ORADFCSAVPT,发现写入了一些数据,这些数据将会保持24小时。


小结:
(1)本实验使用了SavePoints实现了Undo功能,与事务的Rollback不同,你可以保存多份快照,并且可以选择回到哪个快照。
(2)本实验中SavePoints是在TaskFlow外面使用的,当然也可以使用在TaskFlow里面,尤其页面比较多的TaskFlow,这样可以选择“暂存”到某个页面,然后再继续在该页面执行。

Project 下载:ADF_TaskFlow_SavePoints_Explicit.7z

参考文献:
1. http://blogs.oracle.com/raghuyadav/taskflow/
2. http://biemond.blogspot.com/2008/04/automatically-save-transactions-with.html
3. http://biemond.blogspot.com/2008/04/restoring-transactions-with-adf.html
4. http://niallcblogs.blogspot.com/2010/05/adf-taskflow-example.html

没有评论: