【问题标题】:JSF t:dataList the getter for the value is called before the action listener methodJSF t:dataList 在动作侦听器方法之前调用值的 getter
【发布时间】:2012-05-07 15:57:08
【问题描述】:

我有一个具有以下内容的 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 是否,然后创建列表。

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

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

提前致谢。

【问题讨论】:

    标签: jsf actionlistener jsf-1.2


    【解决方案1】:

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

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

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

    您使用的是特立尼达吗?那么解决方案可能是将数据列表的集合保存在page flow scope 中。不过,请考虑一下避免该数据库调用是否值得。

    【讨论】:

    • 嗨,我实际上正在使用具有 saveState 解决方案的战斧,我可以尝试将它用于我的流程。非常感谢您的帮助。
    猜你喜欢
    • 2012-06-07
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多