Once I found it difficult too, and I never used  EventContext because I think 
it is not better than multiple onActivate.

Finally I wrote my own PageActivationContext called PageActivationUnit, the 
difference is that PageActivationContext only can occur once, but 
PageActivationUnit can be used in multiple fields.

For example, a product search page, it has params like 
category,keyword,pagesize,pageno,brand and so on. If using PageActivationUnit, 
the java would be like:

@PageActivationUnit
private Category category;

@PageActivationUnit
private String keyword;

@PageActivationUnit
private Integer pagesize;

@PageActivationUnit
private Integer pageNo;

@PageActivationUnit
private Brand brand;

PageActivationUnit will handle all the activate and passivate event for me, and 
the url requested would be like 
'/searchpage/category-value/keyword-value/pagesize-10/pageNo-2/brand-value'. 
Yes, I encode the field name in the url and its value in a pair.
Another advantage is if later another param 'orderBy' is added, I don't have to 
change any code at all.

DH
http://www.gaonline.com.cn

----- Original Message ----- 
From: "Kalle Korhonen" 
To: "Tapestry users" <users@tapestry.apache.org>
Sent: Tuesday, December 08, 2009 2:22 PM
Subject: Best practice for initializing page to default context


> Most things in T5 are delightfully simple, but I find this
> surprisingly difficult: how to best initialize a page to default
> context (and redirect to it). Imagine you have a search & result page.
> If I access the page without any context I want all records to be
> displayed. In onActivate() without parameters I set the context to
> *all* and return this to redirect, then I query the database in
> setupRender() to initialize the data for the grid. However, sorting
> the grid will also cause a call to onActivate() without parameters,
> resetting my data to the default context. The parameter-less call to
> onActivate() would be harmless if I didn't do a redirect from
> onActivate() but then I cannot set the default context and redirect.
> In setupRender() I could decide whether redirect is needed or not but
> at that time, I'm already committed to rendering the request.
> 
> Because events cause a parameterless onActivate()  call, I tend to
> reserve onActivate() for possible component/event initialization needs
> only and always link to pages with initial context already set. I also
> find it roughly impossible to use overloaded versions of onActivate()
> and subsequently, if my page has multiple entry points, I typically
> resort to implementing it in a single onActivate(EventContext
> eventContext) operation containing a big if-else clause. Since the
> activation context is anyway sent with an event request (as in
> ?t:ac=mycontext), rather than using the encoded context for rendering,
> wouldn't it be just simpler if that context was used for activating
> the page for the event request and the following redirect for
> rendering would just use whatever context onPassivate() returns? What
> do others think, how do you handle this?
> 
> Kalle
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
> For additional commands, e-mail: users-h...@tapestry.apache.org
> 
>

Reply via email to