You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by Matt Welch <ma...@gmail.com> on 2006/02/12 08:47:12 UTC

Using page properties in a DirectLink listener

Forgive the "newbness" of this question, but I'm just curious. Let's say if
have a page class similar to the following:

public class ProductPage extends BasePage{

  private Product product
  public getProduct(){return product;}
  public setProduct(Product product){this.product=product;}

  @InjectPage("ExtraProductInfoPage");
  public abstract ExtraProductInfoPage getExtraProductInfoPage();

  public ExtraProductInfoPage onClickExtraProductInfoLink(){
    getExtraProductInfoPage.setProduct(product);
    return getExtraProductInforPage();
  }
}


Ok, as you can see, I'm attempting to access a page property from within my
listener. the listener is called when someone clicks a DirectLink on the
ProductPage page. I'm guessing that this it is incorrect to access page
properties in this manner, because I'm having sporadic issues with the
product that I'm passing to the next page being null.

First, am I correct in assuming what I'm trying to do here won't work? For
some reason, I thought I had understood that Tapestry used the session to
automatically maintain the page properties between the initial request and
the form submissions or links from the page that had been requested. I
assumed that this meant I could access the page properties from my listener
when it was called.

If this usage is not correct, then is there a way to ensure that I can use
the Product object again in my listener without requerying it from my
database? I suppose I could pass the entire Product object as a parameter to
the DirectLink, but won't that produce a URl that's extremely heavy?

Again, I apologize for what I'm sure is an uninformed question. I searched
the mail archives and wasn't able to discover an answer on my own.

Re: Using page properties in a DirectLink listener

Posted by Raul Raja Martinez <do...@estudiowebs.com>.
You're also using instance variables, which is not recommended.
Instead of:

private Product product
public getProduct(){return product;}
public setProduct(Product product){this.product=product;}

you should simply use:

public abstract Product getProduct();
public abstract void setProduct(Product product);


Tapestry will generate instance variables and implement your methods 
when needed once you abstract class is extended and enhanced. It is my 
understanding that there is no need to use instance variable at all and 
it might cause problems in some cases.



Matt Welch wrote:
> That's a lot of good information for me to digest. Thanks.
> 
> On 2/12/06, Sebastiaan van Erk <se...@sebster.com> wrote:
>> Hi,
>>
>> See http://jakarta.apache.org/tapestry/UsersGuide/state.html. First of
>> all you have a non-tapestry managed property; I don't know if it is
>> automatically cleared when the page is returned to the pool.
>>
>> However, normally a page property is not persisted between requests but
>> cleared as soon as the page goes back to the pool at the end of the
>> request. To use session persistence you could do the following:
>>
>> public abstract class ProductPage extends BasePage {
>>
>>         @Persist("session")
>>         public abstract Product product;
>>
>>         ...
>> }
>>
>> Note that you make your class abstract and you only need to define an
>> abstract getter, and tapestry will make the property for you, handle
>> caching, clearing, etc..
>>
>> Another way to make this work without using the session is by passing
>> for example the product id as argument to the listener, Then you don't
>> need a session. However you will need to requery your object from the
>> database. This should not be a problem if you use something like
>> hibernate with ehcache, since it won't generally actually go to the
>> database but just take the object out of the cache. The most fancy way
>> to do this is to write your own DataSqueezer which "squeezes" your
>> product to a product id and unsqueezes it by getting it back from the
>> database. Then you can actually just pass the Product object as an
>> argument without it being to heavy. See:
>> http://wiki.apache.org/jakarta-tapestry/DataSqueezer
>> for how to write a DataSqueezer.
>>
>> Hope this helps,
>> Sebastiaan
>>
>> Matt Welch wrote:
>>> Forgive the "newbness" of this question, but I'm just curious. Let's say
>> if
>>> have a page class similar to the following:
>>>
>>> public class ProductPage extends BasePage{
>>>
>>>   private Product product
>>>   public getProduct(){return product;}
>>>   public setProduct(Product product){this.product=product;}
>>>
>>>   @InjectPage("ExtraProductInfoPage");
>>>   public abstract ExtraProductInfoPage getExtraProductInfoPage();
>>>
>>>   public ExtraProductInfoPage onClickExtraProductInfoLink(){
>>>     getExtraProductInfoPage.setProduct(product);
>>>     return getExtraProductInforPage();
>>>   }
>>> }
>>>
>>>
>>> Ok, as you can see, I'm attempting to access a page property from within
>> my
>>> listener. the listener is called when someone clicks a DirectLink on the
>>> ProductPage page. I'm guessing that this it is incorrect to access page
>>> properties in this manner, because I'm having sporadic issues with the
>>> product that I'm passing to the next page being null.
>>>
>>> First, am I correct in assuming what I'm trying to do here won't work?
>> For
>>> some reason, I thought I had understood that Tapestry used the session
>> to
>>> automatically maintain the page properties between the initial request
>> and
>>> the form submissions or links from the page that had been requested. I
>>> assumed that this meant I could access the page properties from my
>> listener
>>> when it was called.
>>>
>>> If this usage is not correct, then is there a way to ensure that I can
>> use
>>> the Product object again in my listener without requerying it from my
>>> database? I suppose I could pass the entire Product object as a
>> parameter to
>>> the DirectLink, but won't that produce a URl that's extremely heavy?
>>>
>>> Again, I apologize for what I'm sure is an uninformed question. I
>> searched
>>> the mail archives and wasn't able to discover an answer on my own.
>>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: tapestry-user-unsubscribe@jakarta.apache.org
>> For additional commands, e-mail: tapestry-user-help@jakarta.apache.org
>>
>>
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: tapestry-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tapestry-user-help@jakarta.apache.org


Re: Using page properties in a DirectLink listener

Posted by Matt Welch <ma...@gmail.com>.
That's a lot of good information for me to digest. Thanks.

On 2/12/06, Sebastiaan van Erk <se...@sebster.com> wrote:
>
> Hi,
>
> See http://jakarta.apache.org/tapestry/UsersGuide/state.html. First of
> all you have a non-tapestry managed property; I don't know if it is
> automatically cleared when the page is returned to the pool.
>
> However, normally a page property is not persisted between requests but
> cleared as soon as the page goes back to the pool at the end of the
> request. To use session persistence you could do the following:
>
> public abstract class ProductPage extends BasePage {
>
>         @Persist("session")
>         public abstract Product product;
>
>         ...
> }
>
> Note that you make your class abstract and you only need to define an
> abstract getter, and tapestry will make the property for you, handle
> caching, clearing, etc..
>
> Another way to make this work without using the session is by passing
> for example the product id as argument to the listener, Then you don't
> need a session. However you will need to requery your object from the
> database. This should not be a problem if you use something like
> hibernate with ehcache, since it won't generally actually go to the
> database but just take the object out of the cache. The most fancy way
> to do this is to write your own DataSqueezer which "squeezes" your
> product to a product id and unsqueezes it by getting it back from the
> database. Then you can actually just pass the Product object as an
> argument without it being to heavy. See:
> http://wiki.apache.org/jakarta-tapestry/DataSqueezer
> for how to write a DataSqueezer.
>
> Hope this helps,
> Sebastiaan
>
> Matt Welch wrote:
> > Forgive the "newbness" of this question, but I'm just curious. Let's say
> if
> > have a page class similar to the following:
> >
> > public class ProductPage extends BasePage{
> >
> >   private Product product
> >   public getProduct(){return product;}
> >   public setProduct(Product product){this.product=product;}
> >
> >   @InjectPage("ExtraProductInfoPage");
> >   public abstract ExtraProductInfoPage getExtraProductInfoPage();
> >
> >   public ExtraProductInfoPage onClickExtraProductInfoLink(){
> >     getExtraProductInfoPage.setProduct(product);
> >     return getExtraProductInforPage();
> >   }
> > }
> >
> >
> > Ok, as you can see, I'm attempting to access a page property from within
> my
> > listener. the listener is called when someone clicks a DirectLink on the
> > ProductPage page. I'm guessing that this it is incorrect to access page
> > properties in this manner, because I'm having sporadic issues with the
> > product that I'm passing to the next page being null.
> >
> > First, am I correct in assuming what I'm trying to do here won't work?
> For
> > some reason, I thought I had understood that Tapestry used the session
> to
> > automatically maintain the page properties between the initial request
> and
> > the form submissions or links from the page that had been requested. I
> > assumed that this meant I could access the page properties from my
> listener
> > when it was called.
> >
> > If this usage is not correct, then is there a way to ensure that I can
> use
> > the Product object again in my listener without requerying it from my
> > database? I suppose I could pass the entire Product object as a
> parameter to
> > the DirectLink, but won't that produce a URl that's extremely heavy?
> >
> > Again, I apologize for what I'm sure is an uninformed question. I
> searched
> > the mail archives and wasn't able to discover an answer on my own.
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: tapestry-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: tapestry-user-help@jakarta.apache.org
>
>

Re: Using page properties in a DirectLink listener

Posted by Sebastiaan van Erk <se...@sebster.com>.
Hi,

See http://jakarta.apache.org/tapestry/UsersGuide/state.html. First of 
all you have a non-tapestry managed property; I don't know if it is 
automatically cleared when the page is returned to the pool.

However, normally a page property is not persisted between requests but 
cleared as soon as the page goes back to the pool at the end of the 
request. To use session persistence you could do the following:

public abstract class ProductPage extends BasePage {

	@Persist("session")
	public abstract Product product;

	...
}

Note that you make your class abstract and you only need to define an 
abstract getter, and tapestry will make the property for you, handle 
caching, clearing, etc..

Another way to make this work without using the session is by passing 
for example the product id as argument to the listener, Then you don't 
need a session. However you will need to requery your object from the 
database. This should not be a problem if you use something like 
hibernate with ehcache, since it won't generally actually go to the 
database but just take the object out of the cache. The most fancy way 
to do this is to write your own DataSqueezer which "squeezes" your 
product to a product id and unsqueezes it by getting it back from the 
database. Then you can actually just pass the Product object as an 
argument without it being to heavy. See: 
http://wiki.apache.org/jakarta-tapestry/DataSqueezer
for how to write a DataSqueezer.

Hope this helps,
Sebastiaan

Matt Welch wrote:
> Forgive the "newbness" of this question, but I'm just curious. Let's say if
> have a page class similar to the following:
> 
> public class ProductPage extends BasePage{
> 
>   private Product product
>   public getProduct(){return product;}
>   public setProduct(Product product){this.product=product;}
> 
>   @InjectPage("ExtraProductInfoPage");
>   public abstract ExtraProductInfoPage getExtraProductInfoPage();
> 
>   public ExtraProductInfoPage onClickExtraProductInfoLink(){
>     getExtraProductInfoPage.setProduct(product);
>     return getExtraProductInforPage();
>   }
> }
> 
> 
> Ok, as you can see, I'm attempting to access a page property from within my
> listener. the listener is called when someone clicks a DirectLink on the
> ProductPage page. I'm guessing that this it is incorrect to access page
> properties in this manner, because I'm having sporadic issues with the
> product that I'm passing to the next page being null.
> 
> First, am I correct in assuming what I'm trying to do here won't work? For
> some reason, I thought I had understood that Tapestry used the session to
> automatically maintain the page properties between the initial request and
> the form submissions or links from the page that had been requested. I
> assumed that this meant I could access the page properties from my listener
> when it was called.
> 
> If this usage is not correct, then is there a way to ensure that I can use
> the Product object again in my listener without requerying it from my
> database? I suppose I could pass the entire Product object as a parameter to
> the DirectLink, but won't that produce a URl that's extremely heavy?
> 
> Again, I apologize for what I'm sure is an uninformed question. I searched
> the mail archives and wasn't able to discover an answer on my own.
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: tapestry-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tapestry-user-help@jakarta.apache.org