(I'm still learning to anyone feel free to correct me!) Think of it this way: onPassivate() is used to generate links to your a page. Anytime you to t:pagelink, t:actionlink, or t:form - they all create an instance of your page (even if you don't specify a context), then call onPassivate on it. I *think* each link/form etc will create it's own instance of the page (actually more likely fetching it from the cache) and call onPassivate. So you could see this many times for a single .tml render. onActivate() doesn't necessarily need to be called first. You could @Inject a page, call a setter on it, and then return it from an event handler. I think Tapestry would then call onPassivate and use that to generate the redirect URL for the browser. Then when your browser requests that URL, Tapestry will call the pages onActivate method to attempt restore the state you wanted.
Does that make sense? I know the labeling seems backwards, that's what made it hard for me to grasp - seems weird to passivate something that was never activated! -james On Mon, Dec 8, 2008 at 7:19 PM, Luther Baker <[EMAIL PROTECTED]> wrote: > Question about the flow. > > I GET ViewProject.tml with an activation context of "1" which invokes: > ViewProject.onActivate(Integer projectId) > > I echo the projectId to the screen as a context for a CreateIssue pagelink. > I visit or GET CreateIssue.tml which invokes: > CreateIssue.onActivate(Integer projectId) > Createissue.onPassivate() > > > *Q1*: ?? Why does onPassivate get called here - but not when I visited > ViewProject ?? > > > I complete two fields on the CreateIssue.tml form and submit the form to > CreateIssue.java which invokes > CreateIssue.onActivate(Integer projectId) > CreateIssue.onSuccess() > > > *Q2*: ?? Why isn't CreateIssue.onPassivate called ?? > > > I return CreateIssue.onSuccess returns "ViewProject.class" which invokes: > ViewProject.onPassivate() > ViewProject.onActivate(Integer projectId) > > > *Q3*: ?? Whoa? How'd that happen? I'm going TO ViewProject.tml --- and yet, > onPassivate is invoked first. obviously, ViewProject has NO IDEA what > projectId to return since, it was invoked without an ACTIVATION context. Is > that why onPassivate is called? to find an activation context? I know the > docs say that if no activation context is passed - Tapestry will ask the > page for one. Is this how? If so - one need be a bit careful about how > onPassivate is implemented? > > Is there an HttpSession free way to forward to have CreateIssue.onSuccess > >> > ViewProject.onActivate(Integer projectId) ? > > So - I'm not sure how I can forward to another page and pass an activation > context along with the forward ... Is there a way? After taking a look > here, > http://tapestry.apache.org/tapestry5/tapestry-core/guide/pagenav.html, I > decided to try to @InjectPage so that > > CreateIssue.onSuccess() > { > nextPage.setProject(project); > return nextPage; > } > > and changed ViewProject.onPassivate() to return project.getId() ... which, > is naturally used by ViewProject.Activate(Integer projectId) which is > called > next. > > Does that seem like the right way to do this? I don't need to @Persist as > the example has done - since with this method, I can cause onPassivate to > return what onActivate needs ... and I really don't need to save this info > after the request is handled... But, is it safe to assume that the instance > of the page returned by CreateIssue will be the instance that handles the > request ... ie: do I have a pooling concern when I'm directly assigning > page > properties? > > Man ... this is cool. > > -Luther > -- James A. Hillyerd <[EMAIL PROTECTED]>