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为绑定的呢?