aspose file tools*
The moose likes JSF and the fly likes duplicate call on preRenderView event Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login
JavaRanch » Java Forums » Java » JSF
Bookmark "duplicate call on preRenderView event" Watch "duplicate call on preRenderView event" New topic
Author

duplicate call on preRenderView event

Carlos Jorge Tavares Ferreira
Greenhorn

Joined: Dec 10, 2007
Posts: 17
Hi,

In my xhtml file I've defined the following:



And in my bean:



And for some reason that I can't figure out, the load method is being invoked
twice every time I load the page, forcing me to add a control variable.

I've searched the code and confirmed that only exists one reference to the load method.

What other event can cause this behavior?

Kind regards,

Carlos Ferreira
Brendan Healey
Ranch Hand

Joined: May 12, 2009
Posts: 218

Hi, you should find that if you take the f:event tag outside the f:metadata tags that the listener
fires only once. From experimentation it seems that only f:viewParam tags should be nested
within f:metadata.

I've found this confusing myself because various JSF books contain examples showing f:event
inside f:metadata.

The structure I use is

<f:metadata>
<f:viewparam />
</f:metadata>
<f:event />
<h:head>
</h:head>
<h:body>
</h:body>

Regards,
Brendan.
Carlos Jorge Tavares Ferreira
Greenhorn

Joined: Dec 10, 2007
Posts: 17
Hi Brendan,

Thanks for your reply.

Unfortunately, the suggestion you've made doesn't work. If I don't enclose the f:event tag inside the f:metadata
the load method doesn't get invoked.
So, the problem remains.

Kind regards,

Carlos Ferreira
Carlos Jorge Tavares Ferreira
Greenhorn

Joined: Dec 10, 2007
Posts: 17
Well, I've finally figured it out. I was placing the <f:event> and <f:metadata> tags inside the <ui:composition> tag,
and that was causing the duplicate call.

Kind regards,

Carlos Ferreira
Brendan Healey
Ranch Hand

Joined: May 12, 2009
Posts: 218
If you're using templates JSF should be stripping everything outside of the ui:composition tags,
so I'd not expect your f:event tag to be processed. Here is a code extract from my template and
a content page, this is how I think it should work, note that I explicitly include an f:view tag...

--- template.xhtml ---


--- content.xhtml ---


If you've got this working with f:event outside of the ui:composition tag in a content page then I'd
say that this is almost certainly because of a bug in the implementation, rather than how it should
be done, but if it works for you who am I to argue!

From Core JSF 3rd Ed (Geary/Hortsmann) p184: "Facelets removes all tags outside the ui:composition
tag, that is the doctype declaration, html, head, title and body tags. This is necessary because the
ui:composition is replaced with the template that contains its own set of ... tags".

I perhaps confusingly name the section in my content file (defined by ui:define) metadata although
it contains f:event which is outside f:metadata.

Regards,
Brendan.
Carlos Jorge Tavares Ferreira
Greenhorn

Joined: Dec 10, 2007
Posts: 17
Brendan,

You're absolutely right in what you wrote on your last post. I wrongly mentioned the <ui:composition> tag, when I wanted to refer the <ui:define>.
The solution was moving the <f:metadata><f:event ...></f:metadata> outside the <ui:define> tag.
My mistake, sorry.

Kind regards,

Carlos Ferreira
Karsten Wutzke
Ranch Hand

Joined: Jul 20, 2010
Posts: 106

Be warned, putting

results in undefined behavior:

http://andyschwartz.wordpress.com/2009/07/31/whats-new-in-jsf-2/#get-prerenderview-event

It might just be luck if it's working. It's fragile. Not putting it inside f:metadata might cause the listener method to not be called at some other point and you start wondering what broke. Don't do it!

If you're experiencing redundant calls to the preRenderView method, you have to resort to Seam 3 Faces' s:viewAction instead:

Docs: http://docs.jboss.org/seam/3/faces/latest/reference/en-US/html/components.html#viewaction

This is the predecessor of the upcoming JSF 2.2f:viewAction:

here
http://www.oracle.com/technetwork/articles/java/jsf22-1377252.html

Both Seam 3 Faces and JSF 2.2 give you the ability to control initial/postback request behavior, which JSF 2.0 f:event doesn't. Everything else are "hacks", also see here: http://stackoverflow.com/questions/2830834/jsf-fevent-prerenderview-is-triggered-by-fajax-calls-and-partial-renders-some

Karsten




OCJP JavaSE 6 (86%)
 
 
subject: duplicate call on preRenderView event