OperaMasks 的 delegate机制(Tree,Grid 二次取数)

本文探讨了OperaMasks框架中的二次取数机制,详细解释了为何需要此机制及其实现方式。特别关注动态树组件如何通过TreeDataProvider进行数据更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OperaMasks 二次取数

        OperaMasks的二次取数过程在TreeDelegate类中进行,其中最经典的一个是查看是否有TreeDataProvider,若存在,则直接将UITree下的所有的子节点删除,这也是动态树与静态树最大的区别了,动态树的全部数据从TreeDataProvider来,而静态树则从组件树来。

        如果使用的是动态树,那么直接取得UITree并取得其下的子节点的时候,再对其子节点进行操作,那些这些操作是无法反应到一个Tree上的,因为那些节点将被删除。此时操作的是应该是TreeDataProvider中的数据。

    1.为什么需要二次取数呢?

    因为树Tree,表格DataGrid等组件,需要进行部分数据的更新,如,点击树结点,展开其节点;点击表格的上一页,下一页,都需要进行数据的更新,而这个过程是不需要更新其他表单控件域,大部份情况下。所以造就了二次取数机制的产生。虽然严格上说该处理有违了JSF的生命周期概念,但确实也是一个非常好用的机制。虽然在跨请求方面,需要做一定的完善,但总的还是不错,如果能做到在展开,或者在翻页的时候也做一些事情就好了。

    2.OperaMasks二次取数是如何进行的呢?

    首先了解一下生命周期跳跃的发问:查看到LifeCycle中的execute(FacesContext context)方法,调用了phase.skipPhase(context),这个方法很关键,若为context.getResponseComplete() || context.getRenderResponse(),则跳过2-5周期,就像平时我们使用校验器,或者说是转器等出现异常时,我们都会设置一个context.responseComplete()或者是context.renderResponse(),其中renderResponse()是要开始进行渲染响应了,已经到了这个时机的意思,而responseComplete()指要响应已经完成了,例如页面跳转等,则不需要进行渲染了。

    好了,有了这个跳跃条件,Delegate是如何跳过这些不必要的周期的?先看生命周期的第一周期:RestoreView的execute()方法,查看到:

if (!FacesUtils.isPostback(context)) {
            String viewId = getAssociate(context).getViewId(context);
            if (viewId == null) {
                throw new FacesException("Cannot obtain request view ID");
            }
            view = viewHandler.createView(context, viewId);
            context.setViewRoot(view);
            context.renderResponse();
            return;
        }

 FacesUtils.isPostback(context)进行了判断了。

 

查看各个二次取数的链接是如何设置的

        3.Tree的 value是如何与dataprovider绑定到一起的呢,默认会根据类型直接绑定?那么这个默认是在哪里执行的呢。是否是所有的组件,默认都是以value为绑定的呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值