В PrimeFaces уже есть готовый компонент: <p:outputPanel deferred="true">
.Вам нужно только убедиться, что #{heavyBean}
является только , на который ссылается компонент (и, следовательно, определенно не находится в файле тегов, подобном <c:xxx>
по причинам, объясненным здесь ) внутри <p:outputPanel>
, а не где-то еще.
...
#{notHeavyBean.property}
...
<p:outputPanel deferred="true">
...
#{heavyBean.property}
...
</p:outputPanel>
...
#{anotherNotHeavyBean.property}
...
Тогда вы можете выполнить тяжелую работу с помощью метода @PostConstruct
.Сделайте ту работу, которую вы изначально делали в <f:viewAction>
там, в @PostConstruct
.
@Named
@ViewScoped
public class HeavyBean implements Serializable {
@PostConstruct
public void init() {
// Heavy job here.
}
// ...
}
Если вам нужен доступ к свойствам других bean-компонентов, просто @Inject
эти bean-компоненты в HeavyBean
.Например, в случае, если вам нужен параметр представления ID:
<f:viewParam name="id" value="#{notHeavyBean.id}" />
@Inject
private NotHeavyBean notHeavyBean; // Also @ViewScoped.
@PostConstruct
public void init() {
Long id = notHeavyBean.getId();
// Heavy job here.
}
<p:outputPanel>
уже поставляется с анимированным GIF.Вы можете легко настроить через CSS.
.ui-outputpanel-loading {
background-image: url("another.gif");
}