Hi Jonathan,

thank you for your suggestion.

Yes, @Persist("flash") works fine for one object of for a set of objects that are always readed and showed into the page during the page rendering. And it's fine for a CRUD page that shows only the entity to manage.

To learn T5, I was sperimenting a CRUD page composed by:

1) the list of objects to view / edit / delete rendered by the grid component. This list is alwasy visible.

2) over the grid, a zone that shows the data of selected entity using BeanDisplay or BeanEditor, depending if the user clicks the "view" or the "edit" link of the selected grid row.

The entity data at #2 is displayed only if the user selects an entity from the above grid. When the user navigates the grid the application doesn't show any entity data.

My goal was to provide the user an unique page to show all the entities, to view an existant entity or to create a new one from the same page, without leaving it. I was using the flash persistence mechanism to store both the entity list managed by the grid and the single entity selected by the user. This to avoid to make other queries to the database to retrieve that data when the user executes an action on that page (on the "rewind" phase, as I call it - but it's not the correct term).

I noticed that when the application was not going to show a selected entity (#2), and the user selected another entity from the grid list, the application started to loose the "synchronization" between the grid's selected entity and the entity data showed below... it started to show the data of the old entity instead of the data of the new one.

From my understanding, the value of a page property that uses @Persist("flash") is discarded from the session only after the application reads it to restore that property. So I think the old entity value was not discarded from the session because the application didn't show its data into the page.

Obviously, this was my code fault ;^) I fixed the problem removing the @Persist("flash") annotation on the selected entity property and refactoring a bit the db initialization code.

Luca


Jonathan Barker wrote:
Luca,

Check the Form documentation for prepareForRender() and prepareForSubmit().
They can be better places to do heavy initialization than onActivate().

Also, take a look at @Persist("flash") which is meant to retain information
for only one additional cycle (like the render after a form submit).  You
may find this is satisfactory for your "cache".


Jonathan



-----Original Message-----
From: Luca Fossato [mailto:[EMAIL PROTECTED]
Sent: Friday, April 18, 2008 10:24 AM
To: Tapestry users
Subject: Re: [T5] way to check if the application is entering or exiting
from a page

Hi Chris,

thank you.

Sorry, I didn't explain well. I intended from an "html page" point of
view.
Example: I have a page with a form. I'd like to track its lifecycle
both for the "rewind" and "render" phase
(I use T4 "rewind" term to indicate that the application is "exiting"
from a page, and "render" to indicate the application is entering into
the page)

Here's an example log of the page lifecycle when I press the submit
button of its form:

--- cut here ---

page is rendered; click the submit button of the form:
====> [TRANSACTION] transaction begin...
myPage : pageAttached
myPage : onActivate
** db initialization...
myPage : onSuccessFromForm
myPage: onPassivate (1 time)
<==== [TRANSACTION] closed the entity manager...

myPage : pageDetached

<< form submit was successfull; T5 redirects to the same page;

====> [TRANSACTION] transaction begin...
myPage : pageAttached
myPage : onActivate
** db initialization...
myPage: onPassivate (x times)
<==== [TRANSACTION] closed the entity manager...

myPage : pageDetached

--- cut here ---

It seems to me that pageDetached is executed for both "rewind" and
"render" phases.
I'd like to know if there is an API or a strategy that I can use in
onActivate method (or another initialization method) to know if I am
exiting or entering the page.

For example, I'd like to enter into a page and use onActivate() to
initialize business data from the db and store it into a cache
(session).
Then, when I press the submit button of the form contained into the
page, T5 will re-execute onActivate() again.
At that moment, I'd like to know if I am in the "rewind" phase. If so,
I could get the data from the cache (and then remove it from the
cache, too)

When T5 re-enters into the page and re-executes onActivate() (3rd
time), I will check if the page is in "render" phase.
If so I will query the db again to get "fresh" data.

Regards,
Luca

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to