Link Components
How do I add query parameters to a PageLink or ActionLink?
These components do not have parameters to allow you to specify query parameters for the link; they both allow you to specify a context (one or more values to encode into the request path).
However, you can accomplish the same thing with a little code and markup. For example, to create a link to another page and pass a query parameter, you can replace your PageLink component with a standard <a>
tag:
<a href="${profilePageLink}">Display Profile (w/ full details)</a>
In the matching Java class, you can create the Link programmatically:
@Inject private PageRenderLinkSource linkSource; public Link getProfilePageLink() { Link link = linkSource.createPageRenderLinkWithContext(DisplayProfile.class, user); link.addParameterValue("detail", true); return link; }
... and in the DisplayProfile page:
public class DisplayProfile { void onActivate(@RequestParameter("detail") boolean detail) { . . . } }
The @RequestParameter annotation directs Tapestry to extract the query parameter from the request and coerce it to type boolean. You can use any reasonable type for such a parameter (int, long and Date are common).
A similar technique can be used to add query parmeters to component event URLs (the type generated by the ActionLink or EventLink components), by injecting the ComponentResources, and invoking method createEventLink()
.
How do I create a Link back to the current page from a component?
Sometimes it is useful to create a link back to the current page, but you don't always know the name of the page (the link may appear inside a deeply nested subcomponent). Fortunately, this is easy.
<t:pagelink page="prop:componentResources.pageName">refresh page</t:pagelink>
Every component has an extra property, componentResources, added to it: it's the instance of ComponentResources that represents the link between your code and all of Tapestry's structure around your class. One of the properties of ComponentResources is pageName, the name of the page. By binding the PageLink's page parameter with the "prop:" binding prefix, we ensure that we bind to a computed property; this is necessary because the PageLink.page parameter defaults to the "literal:" binding prefix.
As an added benefit, if the page class is ever renamed or moved to a different package, the pageName property will automatically adjust to the new name.