JSF t:dataList在action listener方法之前调用该值的getter

JSF t:dataList在action listener方法之前调用该值的getter,jsf,actionlistener,jsf-1.2,Jsf,Actionlistener,Jsf 1.2,我有一个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:ou

我有一个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>
我的问题是,当我单击filter按钮时,getNames方法在事件方法筛选器之前被调用。 在getNames方法中,我检查name==null,然后创建列表

但是,如果调用filter方法来创建一个新的过滤列表,基本上我想从DB中得到不同的过滤值,但我不想调用DB两次

我怎样才能达到这个目标


提前感谢。

在JSF生命周期中,首先要做的是在恢复视图阶段重建页面。这里的要点是按照上次请求的方式重新构建页面。这里叫做getNames

稍后,在JSF生命周期的render response阶段结束时,将再次为新页面的值调用getNames

在恢复视图阶段避免DB调用的唯一方法是保存上次请求中返回的数据列表的集合。您的支持bean需要具有高于请求的作用域,或者您需要在请求之间以某种方式保存它们。这不是小事,如果处理不当,可能会导致服务器中RAM的过度使用,因此要小心


你在用特立尼达吗?然后,解决方案可以是将数据列表的集合保存在中。不过,请考虑一下,避免数据库调用是否值得这么做。

您好,我实际上使用的是tomahawk,它具有saveState解决方案,我可以尝试在我的流中使用它。非常感谢你的帮助。