开发环境: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
在页面首次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
http://maping930883.blogspot.com/2009/09/adf039load.html