我有一个JSF(1.2),其中包含以下内容:
<h:outputText rendered="#{fn:length(testBeanToDelete.names) gt 0}">
<t:dataList value="#{testBeanToDelete.names}" var="name" rowIndexVar="index">
<p>#{name}</p>
</t:dataList>
</h:outputText>
<h:form id="test_form">
<h:commandLink value="Filter" actionListener="#{testBeanToDelete.filter}"/>
</h:form>
我的问题是,当我点击过滤器按钮时,在事件方法过滤器之前调用getNames()方法。 在getNames()方法中,我检查name == null然后创建列表。
但是,我希望万一调用filter方法来创建一个新的过滤列表(基本上我想从DB中获取不同的过滤值),但我不想再调用DB两次。
我如何实现这一目标?
提前致谢。
答案 0 :(得分:0)
在JSF生命周期中,首先要做的是在恢复视图阶段重建页面。这里的重点是重建页面,就像它在上一个请求中一样。这里调用getNames()。
稍后,在渲染响应阶段的JSF生命周期结束时,将再次调用getNames()以获取新页面的值。
在恢复视图阶段避免数据库调用的唯一方法是保存上次请求中返回的dataList的集合。您的支持bean需要范围高于请求,否则您需要以某种方式在请求之间保存。这不是微不足道的,如果处理不当会导致服务器中过度使用RAM的问题,所以要小心。
你在使用特立尼达吗?然后解决方案可以是在page flow scope中保存数据列表的集合。不过,请考虑是否避免这种数据库调用是值得的。