Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JSF f:event preRenderView is triggered by f:ajax calls and partial renders, something else?

Tags:

So we have an f:event:

   <f:metadata>     <f:event type="preRenderView" listener="#{dashboardBacking.loadProjectListFromDB}"/>    </f:metadata> 

Which is triggered as desired on initial page load (render).

However this preRenderView event is also triggered by an ajax partial page render, which re-renders an h:panelgroup with the id projectListing, as below.

<h:commandButton action="#{mrBean.addProject}" value="Create Project"                                      title="Start a new project">    <f:ajax render="projectListing" /> </h:commandButton> 

I only want the dashboardBacking.loadProjectListFromDB to be called for the initial page render, but not when there is an ajax partial render. Is there a more appropriate event or method I could be using?

like image 276
Andrew Avatar asked May 13 '10 22:05

Andrew


2 Answers

I had the same need not too long ago. I ended up using something suggested by BalusC.

There is a method in the FacesContext class that lets you know if you're dealing with a full blown request or a partial processing of some sort:

FacesContext.getCurrentInstance().isPostback() 

This way you can still use the preRenderView technique and check if it's a postback in the listener. I found that particularly useful because I needed a session bean as the user had to navigate to another page and come back. If I used view scoped beans (like suggested above by Brian), I'd lose the info I had before navigating away.

like image 84
Andre Avatar answered Nov 07 '22 13:11

Andre


Another option would be to put your preRenderView functionality in a @PostConstruct method of a ViewScoped managed bean. This logic would be executed when the bean is initialized, and you you maintain the same instance of the bean for all your ajax requests until you change views.

like image 39
Brian Leathem Avatar answered Nov 07 '22 13:11

Brian Leathem