如何在更改页面时使ADF查询组件保留其值?

时间:2014-09-17 16:31:55

标签: oracle-adf

我使用的是JDeveloper版本:11.1.2.0.0

在一个jsff的页面中,我有一个af:query组件。查询组件连接到如下表:

<af:query .../>
<af:table .../>

当我转到不在同一个有界任务流中的页面然后再返回到原始页面时,将清除输入到查询中的所有值。有什么好办法可以阻止这种情况吗?我认为查询值将存储在视图对象实例中,但可能并非如此。

当我使用唯一的表但过滤时,过滤器中的值会在我向后导航时停留。

我尝试了一些事情,例如尝试将Querydescriptor存储在bean中但无法使其工作。

这是我用来在用户进行搜索时获取值的代码:

/**Custom Query Listener-Using QueryDescriptor
 * @param queryEvent
 */
public void customQueryProcess(QueryEvent queryEvent) {

    QueryDescriptor qd = queryEvent.getDescriptor();

    ConjunctionCriterion conCrit = qd.getConjunctionCriterion();
    //access the list of search fields
    List<Criterion> criterionList = conCrit.getCriterionList();
    //iterate over the attributes to find FromDate and ToDate
    for (Criterion criterion : criterionList) {
        AttributeDescriptor attrDescriptor = ((AttributeCriterion)criterion).getAttribute();

        String name = attrDescriptor.getName();
        String value = (String)((AttributeCriterion)criterion).getValues().get(0);

        queryValues.put(name, value);

    }

    /**Process default query listener*/
    Context.invokeEL("#{bindings.FlettefeltVCQuery.processQuery}", new Class[] { QueryEvent.class },
                     new Object[] { queryEvent });
}

现在的问题是当用户返回页面时如何应用保存的值?我试图在我的bean中引入一个自定义值属性,我在其中更改值。这导致了奇怪的行为。在我的表中,我获得了特定查询的严格行数,但它们是“行”行。它们似乎只是表格中的第一行。这是我尝试过的代码:

    public QueryDescriptor getCustomQueryDescriptor() {

        QueryDescriptor query = (QueryDescriptor)Context.evaluateEL("#{bindings.FlettefeltVCQuery.queryDescriptor}");

        ConjunctionCriterion conCrit = query.getConjunctionCriterion();
        List<Criterion> criterionList = conCrit.getCriterionList();
        for (Criterion criterion : criterionList) {
            AttributeDescriptor attrDescriptor = ((AttributeCriterion)criterion).getAttribute();

            String name = attrDescriptor.getName();
            AttributeCriterion ac = (AttributeCriterion)criterion;

            if (queryValues.containsKey(name)) {

                List values = ac.getValues();
                values.clear();

                values.set(0, queryValues.get(name));
            }
        }

        return query;
    }

2 个答案:

答案 0 :(得分:1)

我以为你可以&#34;捕获&#34;在Query Listener事件中,您可以访问这些值并将它们存储在bean中。 Thisthis以及docs可能会提供一些想法。

答案 1 :(得分:1)

我找到了解决问题的解决方案。解决方案的关键是将绑定层中搜索区域上的属性 InitialQueryOverridden 设置为 true 。这会在每次输入页面时停止执行查询。但是,如果查询自动在视图条件上设置为 true ,它将在第一次在会话中输入页面时执行查询。

这解决了表中行的问题。他们现在离开并进入页面时不会改变。但是,查询中的值消失了。为了解决这个问题,我在会话bean中编写了以下代码。

public void customQueryProcess(QueryEvent queryEvent) {

    qd = queryEvent.getDescriptor();

    ConjunctionCriterion conCrit = qd.getConjunctionCriterion();
    //access the list of search fields
    List<Criterion> criterionList = conCrit.getCriterionList();
    //iterate over the attributes to find FromDate and ToDate
    for (Criterion criterion : criterionList) {
        AttributeDescriptor attrDescriptor = ((AttributeCriterion)criterion).getAttribute();

        String name = attrDescriptor.getName();
        Object value = ((AttributeCriterion)criterion).getValues().get(0);
        queryValues.put(name, value);

    }

    /**Process default query listener*/
    Context.invokeEL("#{bindings.FlettefeltVCQuery.processQuery}", new Class[] { QueryEvent.class },
                     new Object[] { queryEvent });
}

public QueryModel getCustomQueryModel() {
    System.out.println("getCustomQueryModel");

    QueryModel model = (QueryModel)Context.evaluateEL("#{bindings.CustomersVCQuery.queryModel}");


          List<QueryDescriptor> systemQueries =  model.getSystemQueries();

          for(QueryDescriptor query : systemQueries){

                ConjunctionCriterion conCrit = query.getConjunctionCriterion();
                List<Criterion> criterionList = conCrit.getCriterionList();
                for (Criterion criterion : criterionList) {
                    AttributeDescriptor attrDescriptor = ((AttributeCriterion)criterion).getAttribute();

                    String name = attrDescriptor.getName();
                    AttributeCriterion ac = (AttributeCriterion)criterion;

                    if(queryValues.containsKey(name)){

                        List values = ac.getValues();
                        values.clear();
                        values.set(0, queryValues.get(name));
                    }
                }
           }
    return model;
}

代码通过以下方式连接到我的jsff文件中的查询组件:

<af:query id="qryId1" headerText="My query" disclosed="true"
                          model="#{myQueryBean.customQueryModel}"
                          queryListener="#{myQueryBean.customQueryProcess}"
                          queryOperationListener="#{bindings.CustomersVCQuery.processQueryOperation}"
                          resultComponentId="::resId1" saveQueryMode="hidden"
                          value="#{bindings.CustomersVCQuery.queryDescriptor}"/>