You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by Kaspar Fischer <fi...@inf.ethz.ch> on 2007/11/28 12:11:39 UTC

Re: Dynamic pages (or: arguments to pages) [T4]

Ulrich, Andy, Jesse, Jonathan, and Andy, thanks a lot for
the many responses and tips!

I am using T4 and have implemented it by injecting the web
request into my page and using a URL encoder for friendly URLs.

Regards,
Kaspar

On 27.11.2007, at 01:54, Andy Huhn wrote:

> Kaspar,
>
> If you're using T5, see
>
> http://tapestry.apache.org/tapestry5/tapestry-core/guide/pagenav.html
>
> Especially the section titled "Page activation".
>
> Andy
>
> On Mon, 2007-11-26 at 19:49 +0100, Kaspar Fischer wrote:
>> Hi All,
>>
>> I am new to Tapestry and would be glad to receive a hint on how to
>> realize
>> "dynamic pages", i.e., pages whose content depends on GET arguments.
>>
>> I have a database full of articles, each having an Id, and I want to
>> show each article on its own page. In PHP, I would have used URLs  
>> like
>>
>>    http://my.organization.org/app?page=article&id=2832
>>
>> to display article with Id 2832.
>>
>> I am not quite sure what the Tapestry way for such a problem is. I've
>> coded a page ArticlePage that extends BasePage and now need a way to
>> learn the Id from the URL. How can I do this?
>>
>> Many thanks,
>> Kaspar
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>> For additional commands, e-mail: users-help@tapestry.apache.org
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
>


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


Re: Dynamic pages (or: arguments to pages) [T4]

Posted by Kaspar Fischer <fi...@inf.ethz.ch>.
On 29.11.2007, at 11:02, Ulrich Stärk wrote:

> These are just guesses, I haven't tried them nor verified them.
> I could imagine that the parameter isn't available via the  
> WebRequest because the page didn't get called by a GET request  
> directly but with the help of the service encoder, so your  
> parameter isn't there anymore when the page get's rendered. Try to  
> get hold of the IRequestCycle by calling getRequestCycle() and call  
> getParameter on it. I wouldn't be surprised if it's in there.

Hi Uli,

That was it! It turns out that the

   @InjectObject("infrastructure:request")
   public abstract WebRequest getRequest();

is not needed anymore with this solution.

Thanks a lot for the help,
Kaspar

P.S. For the sake of completeness, here is the complete
solution -- in case somebody else needs it.

public abstract class MyPage extends BasePage
   implements PageBeginRenderListener {

   public void pageBeginRender(PageEvent event)
   {
     super.pageBeginRender(event);

     // find out the node we're suppost to show
     IRequestCycle cycle = getRequestCycle();
     String myParam = cycle.getParameter("myParam");
   }

   // ...
}

public class KCNodeServiceEncoder implements ServiceEncoder {
   // ...

   public void decode(ServiceEncoding encoding)
   {
     // ... (get parameter value from URL)

     encoding.setParameterValue("myParam", value);
   }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: Dynamic pages (or: arguments to pages) [T4]

Posted by Ulrich Stärk <ul...@spielviel.de>.
These are just guesses, I haven't tried them nor verified them.
I could imagine that the parameter isn't available via the WebRequest 
because the page didn't get called by a GET request directly but with 
the help of the service encoder, so your parameter isn't there anymore 
when the page get's rendered. Try to get hold of the IRequestCycle by 
calling getRequestCycle() and call getParameter on it. I wouldn't be 
surprised if it's in there.

Cheers,

Uli

Kaspar Fischer schrieb:
> Unfortunately, my solution does not really work yet. My page
> uses
> 
>   @InjectObject("infrastructure:request")
>   public abstract WebRequest getRequest();
> 
>   public void pageBeginRender(PageEvent event)
>   {
>     super.pageBeginRender(event);
> 
>     WebRequest request = getRequest();
>     id = request.getParameterValue("id")); // (*)
>   }
> 
> to read the Id of the page to display. This indeed works:
> 
>   http://localhost/app?id=someid
> 
> results in id from (*) being set to "someid".
> 
> I now wanted to support friendly URLs and wrote a ServiceEncoder
> whose decode() method extracts the Id form a URL like
> 
>   http://localhost/node/id.html
> 
> and sets it:
> 
>   public void decode(ServiceEncoding encoding)
>   {
>     // ...
>     String id = // ...
> 
>     encoding.setParameterValue(ServiceConstants.SERVICE, 
> Tapestry.PAGE_SERVICE);
>     encoding.setParameterValue(ServiceConstants.PAGE, _className);
>     encoding.setParameterValue("id", id);
> }
> 
> But although the variable encoding contains the parameter "id"
> with its value (I verifed this), the page's pageBeginRender() from
> above receives null.
> 
> I feel I misunderstand something here. Why are parameters not
> passed on to the page request?
> 
> Many thanks,
> Kaspar
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
> 


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


Re: Dynamic pages (or: arguments to pages) [T4]

Posted by Kaspar Fischer <fi...@inf.ethz.ch>.
Unfortunately, my solution does not really work yet. My page
uses

   @InjectObject("infrastructure:request")
   public abstract WebRequest getRequest();

   public void pageBeginRender(PageEvent event)
   {
     super.pageBeginRender(event);

     WebRequest request = getRequest();
     id = request.getParameterValue("id")); // (*)
   }

to read the Id of the page to display. This indeed works:

   http://localhost/app?id=someid

results in id from (*) being set to "someid".

I now wanted to support friendly URLs and wrote a ServiceEncoder
whose decode() method extracts the Id form a URL like

   http://localhost/node/id.html

and sets it:

   public void decode(ServiceEncoding encoding)
   {
     // ...
     String id = // ...

     encoding.setParameterValue(ServiceConstants.SERVICE,  
Tapestry.PAGE_SERVICE);
     encoding.setParameterValue(ServiceConstants.PAGE, _className);
     encoding.setParameterValue("id", id);
}

But although the variable encoding contains the parameter "id"
with its value (I verifed this), the page's pageBeginRender() from
above receives null.

I feel I misunderstand something here. Why are parameters not
passed on to the page request?

Many thanks,
Kaspar

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