2009年9月21日星期一

ADF_039:页面初次Load时是否调用了查询方法?

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

在页面首次Load时是否调用了查询方法?对此,有人在论坛上争论不休。
在这里,我们使用《ADF开发初体验之二:使用EJB、JPA、JSF开发Web应用》的现成的应用HR_EJB_JPA验证一下。

重要步骤说明:

1. 打开HR_EJB_JPA应用,新建一个页面:testPageFirstLoading.jsf

2. 从Data Control中拖放getEmployeesFindBySal方法的名称到页面,生成查询表单

3. 从Data Control中拖放getEmployeesFindBySal方法的返回值Employees到页面,生成查询结果Table

完成后,看起来是这个样子,和普通的查询界面没啥区别。


4. 在Model Project中,找到HRFacadeBean.java
找到getEmployeesFindBySal方法,在返回语句前,加一句Log。
因为查询方法如果被执行,一定会调用该方法,所以我们在这里加上Log,看看页面初次Load是否打出了该Log。
/** <code>select o from Employees o where o.salary > :p_sal</code> */
public List<Employees> getEmployeesFindBySal(BigDecimal p_sal) {
System.out.println("Hi, I am in getEmployeesFindBySal(BigDecimal p_sal).");
return em.createNamedQuery("Employees.findBySal").setParameter("p_sal", p_sal).getResultList();
}

5. 运行testPageFirstLoading.jsf
页面Load完毕后,我们清楚地看到日志中有一行话:Hi, I am in getEmployeesFindBySal(BigDecimal p_sal).

这说明页面初次Load时确实调用了查询方法,不符合一般界面功能的要求。

6. 如何让页面初次Load时不调用了查询方法?
按照逻辑,页面初次Load时,参数为null,此时不应该执行查询。
在本例中,输入参数是p_sal,其不为空的EL表达式为:#{bindings.p_sal.inputValue ne null}。
因此,在testPageFirstLoading.jsf页面中,选择Bindings Tab,选择getEmployeesFindBySalIterator,设置其RefreshCondition为:#{bindings.p_sal.inputValue ne null}。

重新运行页面,发现页面初次Load时没有再打印任何语句,说明没有执行查询方法。
注意,RefreshCondition设置为#{!adfFacesContext.initialRender}是不起作用的,只有在使用ADF-BC实现业务服务层时才起作用。具体原因尚待查明。

问题1:本例是使用EJB作为模型层来验证该问题的,不知道使用ADF-BC作为模型层会怎样?
答:我认为使用ADF-BC作为模型层,页面初次Load时也会调用查询“方法”。
因为不管模型层使用的是哪种技术,都是用的ADF Data Control生成的绑定关系。
当然,这需要进一步验证,因为ADF-BC隐藏了实现细节,因此我们不知道它是如何实现查询的。也就没有办法在某个方法中加Log来判断。
等我对ADF-BC实现细节有了解以后,再来彻底验证这个问题。
当然,如果能够看到查询的SQL 语句,也能说明执行了查询。

问题2:根据参考文献中的说明:
在ADF10g中,设置${adfFacesContext.postback == true}作为Iterator的刷新条件。
在ADF11g中,设置#{!adfFacesContext.initialRender}作为Iterator的刷新条件。

我测试的结果是不是所有的情况都适用,比如对form组件起作用,对table组件不起作用,因此使用时请务必测试。

Project 下载: HR_EJB_JPA PageLoad.7z

参考文献:
1. https://blogs.oracle.com/shay/entry/delay_method_execution_when_us
2. https://blogs.oracle.com/shay/entry/preventing_queries_when_page_f
3. http://www.youtube.com/watch?v=704w8786i14
4. http://adfdevelopers.blogspot.com/2009/06/preventing-execution-of-queries-when.html

没有评论: