0

我有一个 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 是否,然后创建列表。

但是,如果调用过滤器方法来创建一个新的过滤列表(基本上我想从数据库中获取不同的过滤值),我想,但我不想调用数据库两次。

我怎样才能实现这个目标?

提前致谢。

4

1 回答 1

0

在 JSF 生命周期中,要做的第一件事就是在恢复视图阶段重建页面。这里的重点是重建页面,就像它在最后一个请求中一样。这里调用 getNames()。

稍后,在呈现响应阶段的 JSF 生命周期结束时,将再次调用 getNames() 以获取新页面的值。

在恢复视图阶段避免数据库调用的唯一方法是保存您在上次请求中返回的 dataList 的集合。您的支持 bean 需要具有高于请求的范围,否则您需要以某种方式在请求之间保存它们。这不是微不足道的,如果处理不当可能会导致服务器过度使用 RAM 的问题,所以要小心。

你在使用特立尼达吗?然后解决方案可能是将数据列表的集合保存在页面流范围内。不过,请考虑避免该数据库调用是否值得所有这些。

于 2012-05-07T16:17:19.407 回答