如何在managedbean中更改后呈现视图组件?

时间:2015-07-02 19:25:27

标签: jsf-2

我有一个输出文本显示屏幕上的服务数量:

<h:outputText
        value="Services #{bean.counterManager.serviceCounter}">
</h:outputText>

在它下面是一个调用getServices()方法的accordionpanel:

        <p:accordionPanel value="#{bean.services}" var="service">

getServices()方法中,我递增计数器,当我在返回点调试时,它是143.

public List<Service> getServices() 
{
    if (this.services.isEmpty())
    {
        //Does other stuff, fills this.Services
        this.counterManager.incrementServiceCounter(someValue); //
    }
    return this.services;
}

但是它在屏幕上显示为0,因为getServices()在outputText调用getCounterManager()之后被调用,可能是因为输出文本位于我的XHTML上的accordionpanel之上。

我希望serviceCounter显示143而不是0,但是在调用getLinhasStruct()后我不知道如何使它渲染,我不能把它放在手风琴面板下面的outputtext因为这会弄乱页面的布局,所以我该怎么做?

1 个答案:

答案 0 :(得分:1)

永远不要在getter中做业务逻辑。你需要确保所有的getter(和setter)都是纯粹的getter(和setter)。

public List<Service> getServices() {
    return services;
}

在IDE自动生成bean类的最底层之后,只需永远忽略它们。别碰它们。好像它们不存在一样。您应该在动作事件侦听器中执行业务逻辑。

您的具体问题是由于那些getter方法在渲染响应阶段被调用的顺序与组件出现在树中的顺序相同,并且您的代码错误地依赖于从辅助bean内部无法控制的内容。

你没有说明问题中的具体功能要求,因此有点难以指出正确的方法,但总的来说,以下方法取决于你何时想要执行业务逻辑。

  1. 在初始GET请求期间?使用<f:viewAction>
  2. 在渲染视图之前?使用<f:event type="preRenderView">
  3. 在bean初始化期间?使用@PostConstruct
  4. 另见: