如何使用ActiveOutputText组件?

187 篇文章 2 订阅
运行环境: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  
<?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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值