Los parámetros aparecen en la URL solo si la página es tildable, o si el enlace específico es marcable.
Si crea un Link
que navega a la página utilizando setResponsePage(Page)
(pasando una instancia de página) en lugar de setResponsePage(Class<Page>, PageParameters)
(pasando una clase de página), el enlace creado no va a apuntar a la versión bookmarkable de la página, sino a un stateful ejemplo.
Para que esto funcione, no debe llamar al constructor super(PageParameters)
(para que la página no tenga suficiente información para compilar la URL sin estado).
En este ejemplo, puede navegar al SecretPage
a través de dos enlaces diferentes, uno sin estado, marcado como favorito y el otro con estado.
SecretPage
también tiene dos constructores. Uno recibe un PageParameters
y lo llama pasando el super
. El otro recibe el valor directamente a través del parámetro construcor, y no lo pasa a super
(si hubiera llamado al super(new PageParameters().add("message",message)
, como en la línea comentada, redirigiría automáticamente a una URL marcable).
HomePage.java:
public class HomePage extends WebPage {
public HomePage(final PageParameters parameters) {
add(new BookmarkablePageLink<Void>("bookmarkable", SecretPage.class,
new PageParameters().add("message", "This message will appear in the URL")));
add(new Link<Void>("instance") {
@Override
public void onClick() {
setResponsePage(new SecretPage("This message will NOT appear in the URL"));
}
});
}
}
homepage.html:
<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd" >
<body>
<p><a wicket:id="bookmarkable">Bookmarkable link (stateless)</a></p>
<p><a wicket:id="instance">Hidden parameters link (stateful)</a></p>
</body>
</html>
SecretPage.java
public class SecretPage extends WebPage {
public SecretPage(PageParameters parameters) {
super(parameters);
init(parameters.get("message").toString("No message!"));
}
public SecretPage(String message) {
// super(new PageParameters().add("message", message)); // COMMENTED!
init(message);
}
private void init(String message) {
info(message);
add(new FeedbackPanel("feedback"));
add(new BookmarkablePageLink<Void>("back", getApplication().getHomePage()));
}
}
SecretPage.html
<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd" >
<body>
<p wicket:id="feedback"></p>
<p><a wicket:id="back">BACK</a></p>
</body>
</html>
Y, para tener una URL simple, como http://host/app/secret
, debe montarla. Puedes hacerlo en tu clase WebApplication
.
WicketApplication.java
public class WicketApplication extends WebApplication {
@Override
protected void init() {
super.init();
mountPage("home", getHomePage());
mountPage("secret", SecretPage.class);
}
public Class<HomePage> getHomePage() {
return HomePage.class;
}
}
este ejemplo se utiliza Wicket 1.5 (todavía RC4.2), y necesitan algunas modificaciones para trabajar con 1.4.x (se cambió el nombre de algunos métodos y clases, o se mueven a diferentes paquetes), pero la idea es la mismo.
Omita el bit "Marcable", use un simple 'PageLink'. Si mal no recuerdo, debería funcionar. – biziclop
@biziclop: He estado tratando de usar un 'Enlace' estándar -en realidad, una subclase de' Enlace', ya que 'Enlace' es abstracto- pero implica muchas otras modificaciones. 'PageLink' está en desuso, el Javadoc recomienda utilizar' BookmarkablePageLink' o 'Link' en su lugar. – Pops
@Lord Torgamus Bueno, usa un 'Enlace' luego. :) O puede vivir con que está en desuso y usar 'PageLink'. Aunque no veo cómo usar un 'Enlace' puede ser mucho más complicado. ¿Puedes agregar más detalles sobre esto? Tal vez podamos encontrar una solución simple con 'Link's – biziclop