如何使用ActiveOutputText组件?
来源:互联网 发布:禁用445端口 编辑:程序博客网 时间:2024/05/22 15:08
运行环境:JDeveloper 11.1.2.2.0 + Oracle Database 10g Express Edition 10.2.0.1。
我们常用的组件是OutputText,它是用来显示Label的。那么,ActiveOutputText比OutputText特殊在哪里呢?
当内容发生改变时,ActiveOutputText组件可以帮助我们从后台“动态刷新”内容,用户无需做任何操作。
同样的功能如果使用OutputText组件来实现,就需要使用PPR的功能。
本实验取材于ADF Faces Rich Client Components Demo。
关于Demo的详细说明,比如下载、安装、源代码等等,请参考《发布与运行ADF Faces Rich Client Components Demo》。
访问http://jdevadf.oracle.com/adf-richclient-demo/faces/visualDesigns/activeCounter.jspx,可以看到运行效果:页面上的计数器会不断增长并自动刷新。
为了彻底搞清楚ActiveOutputText使用方法,我重新开发了一个应用,模仿Demo中的实现。
重点步骤说明:
1. ActiveOutputText组件页面代码
<af:activeOutputText value="#{counterBean.state}" id="aot1"
inlineStyle="color:brown;font-size:100px;font-weight:bold;text-align:center;"></af:activeOutputText>
2. 在adfc-config.xml中注册Managed Bean: CounterBean
3. 完整的Managed Bean代码
说明:
(1)CounterBean必须实现ActiveDataModel接口,这里是继承BaseActiveDataModel,后者实现了ActiveDataModel接口。
(2)使用ActiveModelContext注册该ActiveDataModel(即CounterBean),并把keyPath与"state"属性关联起来,这样当"state"属性发生变化时,Model层可以监听到,并通知视图层,视图层将会随之改变。
(3)使用Timer来定时启动任务UpdateTask,即执行UpdateTask类的run方法。
其中第1个参数2000表示第一次执行时延迟2秒钟, 第2个参数2000表示每2秒钟执行一次。
(4)UpdateTask类是一个多线程任务:增加计数器值,并且“引爆”数据改变事件。
(5)使用ActiveDataEventUtil创建事件,更新Model。
其中参数type表示改变事件的类型,可以设置为UPDATE, INSERT, DELETE, REFRESH,等等;
参数changeCount用来保证读取一致性;
参数key表示当前记录的key,适用于Model是CollectionModel类型的情况;
参数insertKey表示插入的位置,适用于Model是CollectionModel类型的情况;
参数names表示已改变的属性名称;
参数values表示已改变的属性值。
我们常用的组件是OutputText,它是用来显示Label的。那么,ActiveOutputText比OutputText特殊在哪里呢?
当内容发生改变时,ActiveOutputText组件可以帮助我们从后台“动态刷新”内容,用户无需做任何操作。
同样的功能如果使用OutputText组件来实现,就需要使用PPR的功能。
本实验取材于ADF Faces Rich Client Components Demo。
关于Demo的详细说明,比如下载、安装、源代码等等,请参考《发布与运行ADF Faces Rich Client Components Demo》。
访问http://jdevadf.oracle.com/adf-richclient-demo/faces/visualDesigns/activeCounter.jspx,可以看到运行效果:页面上的计数器会不断增长并自动刷新。
为了彻底搞清楚ActiveOutputText使用方法,我重新开发了一个应用,模仿Demo中的实现。
重点步骤说明:
1. ActiveOutputText组件页面代码
<af:activeOutputText value="#{counterBean.state}" id="aot1"
inlineStyle="color:brown;font-size:100px;font-weight:bold;text-align:center;"></af:activeOutputText>
2. 在adfc-config.xml中注册Managed Bean: CounterBean
<?xml version="1.0" encoding="UTF-8" ?><adfc-config xmlns="http://xmlns.oracle.com/adf/controller" version="1.2"> <managed-bean id="__1"> <managed-bean-name>counterBean</managed-bean-name> <managed-bean-class>view.CounterBean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean></adfc-config>
3. 完整的Managed Bean代码
package view;import java.util.Collection;import java.util.Timer;import java.util.TimerTask;import java.util.concurrent.atomic.AtomicInteger;import oracle.adf.view.rich.activedata.ActiveModelContext;import oracle.adf.view.rich.activedata.BaseActiveDataModel;import oracle.adf.view.rich.event.ActiveDataEntry;import oracle.adf.view.rich.event.ActiveDataUpdateEvent;import oracle.adf.view.rich.activedata.ActiveDataEventUtil;//import oracle.adfinternal.view.faces.activedata.ActiveDataEventUtil;public class CounterBean extends BaseActiveDataModel { public String getState() { ActiveModelContext context = ActiveModelContext.getActiveModelContext(); Object[] keyPath = new String[0]; context.addActiveModelInfo(this, keyPath, "state"); timer.schedule(new UpdateTask(), 2000, 2000); return String.valueOf(counter); } // not needed as we do not need to connect to a (real) active data source... protected void startActiveData(Collection<Object> rowKeys, int startChangeCount) { } // not needed as we do not need to disconnect from a (real) active data source... protected void stopActiveData(Collection<Object> rowKeys) { } public int getCurrentChangeCount() { return counter.get(); } protected class UpdateTask extends TimerTask { public void run() { counter.incrementAndGet(); ActiveDataUpdateEvent event = ActiveDataEventUtil.buildActiveDataUpdateEvent(ActiveDataEntry.ChangeType.UPDATE, counter.get(), new String[0], null, new String[] { "state" }, new Object[] { counter.get() }); fireActiveDataUpdate(event); } } private static final Timer timer = new Timer(); private final AtomicInteger counter = new AtomicInteger(0);}
说明:
(1)CounterBean必须实现ActiveDataModel接口,这里是继承BaseActiveDataModel,后者实现了ActiveDataModel接口。
(2)使用ActiveModelContext注册该ActiveDataModel(即CounterBean),并把keyPath与"state"属性关联起来,这样当"state"属性发生变化时,Model层可以监听到,并通知视图层,视图层将会随之改变。
(3)使用Timer来定时启动任务UpdateTask,即执行UpdateTask类的run方法。
其中第1个参数2000表示第一次执行时延迟2秒钟, 第2个参数2000表示每2秒钟执行一次。
(4)UpdateTask类是一个多线程任务:增加计数器值,并且“引爆”数据改变事件。
(5)使用ActiveDataEventUtil创建事件,更新Model。
其中参数type表示改变事件的类型,可以设置为UPDATE, INSERT, DELETE, REFRESH,等等;
参数changeCount用来保证读取一致性;
参数key表示当前记录的key,适用于Model是CollectionModel类型的情况;
参数insertKey表示插入的位置,适用于Model是CollectionModel类型的情况;
参数names表示已改变的属性名称;
参数values表示已改变的属性值。
Project 下载:ADF_ActiveOutputText.7z
http://maping930883.blogspot.com/2012/07/adf171activeoutputtext.html
0 0
- 如何使用ActiveOutputText组件?
- 如何使用ActiveImage组件?
- 如何使用 ToolTip 组件
- 如何使用iview组件
- 如何使用af:selectManyChoice组件
- 如何使用swing组件表
- 如何使用 Swing 组件 JTable
- C# 如何使用 ErrorProvider 组件
- 如何使用PageHelper分页组件
- 如何注册OWC组件(软件使用excel图表组件)
- Delph组件如何使用自己的图标
- 如何使用Jmail组件发送邮件
- Visual C#如何使用Active X组件
- 如何使用容器内的组件
- 如何对电子表格组件使用自定义函数
- 如何使用displaytag表格(table)组件
- 如何使用第三方COM组件
- Delph组件如何使用自己的图标
- 使用Contextual Event在Region之间传递事件
- servlet实现请求转发(mvc设计模式)与请求重定向问题
- 云 CentOS 解决中文乱码方法. [自己备用]
- POJ1584-A Round Peg in a Ground Hole(凸包,判圆在凸包内)
- 浅谈java异常[Exception]
- 如何使用ActiveOutputText组件?
- 黑马程序员,黑马论坛-----多线程知识点总结
- 如何使用ActiveImage组件?
- 操作系统总结
- 监听类的写法
- [小技巧] 对当前目录的文件按大小排序
- shell脚本,每次读取文件的一行,逐行读取并处理
- 每天一个linux命令目录
- 如何在Table组件中使用Active Data Service?