2010年4月11日星期日

ADF_066:使用ADF-BC 实现查询功能之六:使用Popup组件实现全字段查询

开发环境:JDevloper 11.1.2.1.0+ Oracle Database 10g Express Edition 10.2.0.1。

在《使用ADF-BC 实现查询功能之一:All Queriable Attributes》中,全字段查询界面和结果是在同一个页面。
实际使用中,有些客户希望把查询界面放到popup组件中,查询完毕后,页面刷新显示查询结果。
这里我们可以使用一些小技巧,不需要很大的改动就可以实现该功能。
重要步骤说明:

1. 创建页面,添加查询按钮,点击后弹出popup组件

2. 创建popup组件
(1)在其中添加dialog组件,其中Type=none,表明不需要任何OK或Cancel按钮。
(2)在dialog组件中,拖放All Queriable Attributes生成全字段查询Panel,其内容如下:
<af:query id="qryId1" headerText="Search" disclosed="true"
          value="#{bindings.ImplicitViewCriteriaQuery.queryDescriptor}"
          model="#{bindings.ImplicitViewCriteriaQuery.queryModel}"
          queryListener="#{bindings.ImplicitViewCriteriaQuery.processQuery}"
          queryOperationListener="#{bindings.ImplicitViewCriteriaQuery.processQueryOperation}"
          resultComponentId="::resId1"/>

稍后我们会做些改动。

3. 创建一个Managed Bean
(1)把table组件绑定到Managed Bean中的一个属性,这样可以在代码中操作table组件。
(2)把popup组件绑定到Managed Bean中的一个属性,这样可以在代码中操作table组件。
(3)修改queryListener,将其指向Managed Bean中的一个方法: queryListener="#{myBackingBean.queryListener}"。
queryListener方法内容如下:
public void queryListener(QueryEvent queryEvent) {
    // 首先通过程序调用原有的queryListener
    JSFUtils.invokeMethodExpression("#{bindings.ImplicitViewCriteriaQuery.processQuery}", Object.class,
                                        QueryEvent.class, queryEvent);
    // 隐藏popup组件
    searchPopup.hide();
    // 刷新table组件
    AdfFacesContext.getCurrentInstance().addPartialTarget(resultTable);
}


4. 运行页面
点击Search按钮,弹出popup窗口,输入条件,回车确定。

Table将显示符合查询条件的记录。


5. 小结
使用JSFUtils.invokeMethodExpression可以在代码中调用原来绑定在组件上的Listener事件。
这是一种定制组件Listener事件的方式:在调用原有Listener方法的前后加入自己的逻辑。

Project 下载:ADF_QueryInPopup.7z

没有评论: