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
没有评论:
发表评论