You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by Joel Halbert <jo...@su3analytics.com> on 2008/10/08 20:22:34 UTC
"named" page context parameters ?
Hi,
Is it possible to have "named" page context parameters? (along the lines
of Wicket PageParameters).
I would like to be able to have bookmarkable URLs but rather than
indexing page context parameters (in onActivate) by ordinal in a list I
would rather key them by name.
Thx,
Joel
--
SU3 Analytics Ltd
61b Oxford Gardens
W10 5UJ
London
Tel: +44 20 8960 2634
Mob: +44 75 2501 0825
www.su3analytics.com
SU3 Analytics Ltd is a company registered in England and Wales under company number 06639473 at registered address 61b Oxford Gardens, London W10 5UJ, United Kingdom.
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org
Re: "named" page context parameters ?
Posted by Ivan Dubrov <wf...@gmail.com>.
Hi,
I’ve put an updated version of ZIP, with missing QueryParameter annotation.
Note that you need to add TapExtModule as a submodule of your
application module (use @SubModule( { TapExtModule.class } annotation)
or simply copy its contents into your module.
Joel Halbert wrote:
> Hi Ivan,
>
> I'm trying out your extension, thanks, one question though:
> The following class seems to be missing from the zip you linked to
> below (http://wfrag.org/files/tapext.zip):
>
> ru.nsc.ict.catalogue.annotations.QueryParameter
>
> can i get it anywhere?
>
> Thx
> Joel
>
> Ivan Dubrov wrote:
>> Joel Halbert wrote:
>>
>>> Hi,
>>>
>>> Is it possible to have "named" page context parameters? (along the
>>> lines of Wicket PageParameters).
>>>
>>> I would like to be able to have bookmarkable URLs but rather than
>>> indexing page context parameters (in onActivate) by ordinal in a list
>>> I would rather key them by name.
>>>
>>
>> You can use Link#addParameter to add named parameters to Link and
>> Request#getParameter to get parameter value. This is simple way, but
>> requires some extra coding.
>>
>>
>> I’ve wrote my simple extension to Tapestry that allows to work with
>> named parameters the same way as with regular context parameters. You
>> can either implement your event handlers
>> (onStoreParameters/onRestoreParameters, their meaning is similar to
>> onPassivate/onActivate) or use @QueryParameter annotatiton.
>>
>> Code: http://wfrag.org/files/tapext.zip
>>
>> You can use it the following way (snippet from page class):
>>
>> @QueryParameter
>> private Integer page;
>>
>> The @QueryParameter works the similar way to @PageActivationContext
>> annotation
>>
>> Since createPageLink/createEventLink and t:pagelink/t:eventlink does not
>> support overriding named parameters, to generate a link with “page”
>> value other than current one, you can use the following workaround:
>>
>> // We temporarily set page to current one, to generate proper link,
>> // since we don't have a way to override parameter values
>> int saved = page;
>> page = newpage;
>> Link link = resources.createPageLink(resources.getPageName(), false);
>> page = saved;
>>
>>
>> Also, the code does not work well for primitive types (like “int”), so
>> it’s better to use wrappers.
>>
>>
>>
>
--
WBR,
Ivan S. Dubrov
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org
Re: "named" page context parameters ? - using a Custom ValueEncoder
Posted by "Thiago H. de Paula Figueiredo" <th...@gmail.com>.
Em Thu, 09 Oct 2008 10:57:31 -0300, Joel Halbert <jo...@su3analytics.com>
escreveu:
> Hi Thiago,
Hi, Joel!
> How would that work? The ValueEncoder.toClient method must return a
> String...something like this:
Oops, of course it wouldn't wok with a ValueEncoder. I'm sorry. :(
Instead of using a ValueEncoder, just pass the List (created from your
Map) to the context parameter of the PageLink component. By the way, the
type of the PageLink's context parameter is List. ;)
--
Thiago H. de Paula Figueiredo
Independent Java consultant, developer, and instructor
Consultor, desenvolvedor e instrutor em Java
http://www.arsmachina.com.br/thiago
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org
Re: "named" page context parameters ? - using a Custom ValueEncoder
Posted by Joel Halbert <jo...@su3analytics.com>.
Hi Thiago,
How would that work? The ValueEncoder.toClient method must return a
String...something like this:
import org.apache.tapestry5.ValueEncoder;
public class MapValueEncoder implements ValueEncoder {
private static final String DELIM = "/";
@Override
public String toClient(Object value) {
String res = "";
Map<String,Object> map = (Map<String, Object>) value;
for (Iterator<String> it = map.keySet().iterator();
it.hasNext(); ) {
if (res.length() > 0) {
res += DELIM;
}
String key = it.next();
res += key + DELIM + map.get(key).toString();
}
return res;
}
@Override
public Object toValue(String clientValue) {
try {
clientValue = URLDecoder.decode(clientValue, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
String[] tokens = clientValue.split(DELIM);
Map<String, String> res = new HashMap<String, String>();
boolean tokIsKey = true;
String currKey = null;
for (int i = 0; i < tokens.length; i++) {
String tok = tokens[i];
if (tokIsKey) {
currKey = tok;
} else {
res.put(currKey, tok);
}
tokIsKey = !tokIsKey;
}
return null;
}
}
Thiago H. de Paula Figueiredo wrote:
> Em Thu, 09 Oct 2008 08:06:09 -0300, Joel Halbert
> <jo...@su3analytics.com> escreveu:
>
>> Encode a Map of String/Object pairs to a string of the following
>> form: key1/value1/key2/value2 etc...
>> (and of course decode said string back to a map that can be passed to
>> the context)
>
> Instead of encoding to a String, encode it to a List (first key, first
> value, second key, second value, etc). This way, the slashes won't be
> URL encoded.
>
--
SU3 Analytics Ltd
61b Oxford Gardens
W10 5UJ
London
Tel: +44 20 8960 2634
Mob: +44 75 2501 0825
www.su3analytics.com
SU3 Analytics Ltd is a company registered in England and Wales under company number 06639473 at registered address 61b Oxford Gardens, London W10 5UJ, United Kingdom.
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org
Re: "named" page context parameters ? - using a Custom ValueEncoder
Posted by "Thiago H. de Paula Figueiredo" <th...@gmail.com>.
Em Thu, 09 Oct 2008 08:06:09 -0300, Joel Halbert <jo...@su3analytics.com>
escreveu:
> Encode a Map of String/Object pairs to a string of the following form:
> key1/value1/key2/value2 etc...
> (and of course decode said string back to a map that can be passed to
> the context)
Instead of encoding to a String, encode it to a List (first key, first
value, second key, second value, etc). This way, the slashes won't be URL
encoded.
--
Thiago H. de Paula Figueiredo
Independent Java consultant, developer, and instructor
Consultor, desenvolvedor e instrutor em Java
http://www.arsmachina.com.br/thiago
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org
Re: "named" page context parameters ? - using a Custom ValueEncoder
Posted by Joel Halbert <jo...@su3analytics.com>.
Hi,
I think I found a simple way of passing named context parameters between
pages and this is to create a custom ValueEncoder for map objects. I
created a MapValueEncoder, and my intention was for it to do the following :
Encode a Map of String/Object pairs to a string of the following form:
key1/value1/key2/value2 etc...
(and of course decode said string back to a map that can be passed to
the context)
This has the advantage (I thought) of creating nice URLs from my map
context e.g.
www.mysite.com/key1/value1/key2/value2
The problem is that the context string is URL encoded so that the
forward slashes come out as
key1%252F%252Fvalue1%252F%252Fkey2%252F%252Fvalue2
Is there anyway to override the default encoding of
TapestryInternalUtils.encodeContext(id) ?
thx
Joel Halbert wrote:
> Hi Ivan,
>
> I'm trying out your extension, thanks, one question though:
> The following class seems to be missing from the zip you linked to
> below (http://wfrag.org/files/tapext.zip):
>
> ru.nsc.ict.catalogue.annotations.QueryParameter
>
> can i get it anywhere?
>
> Thx
> Joel
>
> Ivan Dubrov wrote:
>> Joel Halbert wrote:
>>> Hi,
>>>
>>> Is it possible to have "named" page context parameters? (along the
>>> lines of Wicket PageParameters).
>>>
>>> I would like to be able to have bookmarkable URLs but rather than
>>> indexing page context parameters (in onActivate) by ordinal in a list
>>> I would rather key them by name.
>>
>> You can use Link#addParameter to add named parameters to Link and
>> Request#getParameter to get parameter value. This is simple way, but
>> requires some extra coding.
>>
>>
>> I’ve wrote my simple extension to Tapestry that allows to work with
>> named parameters the same way as with regular context parameters. You
>> can either implement your event handlers
>> (onStoreParameters/onRestoreParameters, their meaning is similar to
>> onPassivate/onActivate) or use @QueryParameter annotatiton.
>>
>> Code: http://wfrag.org/files/tapext.zip
>>
>> You can use it the following way (snippet from page class):
>>
>> @QueryParameter
>> private Integer page;
>>
>> The @QueryParameter works the similar way to @PageActivationContext
>> annotation
>>
>> Since createPageLink/createEventLink and t:pagelink/t:eventlink does not
>> support overriding named parameters, to generate a link with “page”
>> value other than current one, you can use the following workaround:
>>
>> // We temporarily set page to current one, to generate proper link,
>> // since we don't have a way to override parameter values
>> int saved = page;
>> page = newpage;
>> Link link = resources.createPageLink(resources.getPageName(), false);
>> page = saved;
>>
>>
>> Also, the code does not work well for primitive types (like “int”), so
>> it’s better to use wrappers.
>>
>>
>
--
SU3 Analytics Ltd
61b Oxford Gardens
W10 5UJ
London
Tel: +44 20 8960 2634
Mob: +44 75 2501 0825
www.su3analytics.com
SU3 Analytics Ltd is a company registered in England and Wales under company number 06639473 at registered address 61b Oxford Gardens, London W10 5UJ, United Kingdom.
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org
Re: "named" page context parameters ?
Posted by Joel Halbert <jo...@su3analytics.com>.
Hi Ivan,
I'm trying out your extension, thanks, one question though:
The following class seems to be missing from the zip you linked to below
(http://wfrag.org/files/tapext.zip):
ru.nsc.ict.catalogue.annotations.QueryParameter
can i get it anywhere?
Thx
Joel
Ivan Dubrov wrote:
> Joel Halbert wrote:
>
>> Hi,
>>
>> Is it possible to have "named" page context parameters? (along the
>> lines of Wicket PageParameters).
>>
>> I would like to be able to have bookmarkable URLs but rather than
>> indexing page context parameters (in onActivate) by ordinal in a list
>> I would rather key them by name.
>>
>
> You can use Link#addParameter to add named parameters to Link and
> Request#getParameter to get parameter value. This is simple way, but
> requires some extra coding.
>
>
> I’ve wrote my simple extension to Tapestry that allows to work with
> named parameters the same way as with regular context parameters. You
> can either implement your event handlers
> (onStoreParameters/onRestoreParameters, their meaning is similar to
> onPassivate/onActivate) or use @QueryParameter annotatiton.
>
> Code: http://wfrag.org/files/tapext.zip
>
> You can use it the following way (snippet from page class):
>
> @QueryParameter
> private Integer page;
>
> The @QueryParameter works the similar way to @PageActivationContext
> annotation
>
> Since createPageLink/createEventLink and t:pagelink/t:eventlink does not
> support overriding named parameters, to generate a link with “page”
> value other than current one, you can use the following workaround:
>
> // We temporarily set page to current one, to generate proper link,
> // since we don't have a way to override parameter values
> int saved = page;
> page = newpage;
> Link link = resources.createPageLink(resources.getPageName(), false);
> page = saved;
>
>
> Also, the code does not work well for primitive types (like “int”), so
> it’s better to use wrappers.
>
>
>
--
SU3 Analytics Ltd
61b Oxford Gardens
W10 5UJ
London
Tel: +44 20 8960 2634
Mob: +44 75 2501 0825
www.su3analytics.com
SU3 Analytics Ltd is a company registered in England and Wales under company number 06639473 at registered address 61b Oxford Gardens, London W10 5UJ, United Kingdom.
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org
Re: "named" page context parameters ?
Posted by Ivan Dubrov <wf...@gmail.com>.
Joel Halbert wrote:
> Hi,
>
> Is it possible to have "named" page context parameters? (along the
> lines of Wicket PageParameters).
>
> I would like to be able to have bookmarkable URLs but rather than
> indexing page context parameters (in onActivate) by ordinal in a list
> I would rather key them by name.
You can use Link#addParameter to add named parameters to Link and
Request#getParameter to get parameter value. This is simple way, but
requires some extra coding.
I’ve wrote my simple extension to Tapestry that allows to work with
named parameters the same way as with regular context parameters. You
can either implement your event handlers
(onStoreParameters/onRestoreParameters, their meaning is similar to
onPassivate/onActivate) or use @QueryParameter annotatiton.
Code: http://wfrag.org/files/tapext.zip
You can use it the following way (snippet from page class):
@QueryParameter
private Integer page;
The @QueryParameter works the similar way to @PageActivationContext
annotation
Since createPageLink/createEventLink and t:pagelink/t:eventlink does not
support overriding named parameters, to generate a link with “page”
value other than current one, you can use the following workaround:
// We temporarily set page to current one, to generate proper link,
// since we don't have a way to override parameter values
int saved = page;
page = newpage;
Link link = resources.createPageLink(resources.getPageName(), false);
page = saved;
Also, the code does not work well for primitive types (like “int”), so
it’s better to use wrappers.
--
WBR,
Ivan S. Dubrov
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org