Pregunta

Actualmente estoy creando un conjunto de enlaces con código como este:

BookmarkablePageLink<CheeseMain> havarti =
    new BookmarkablePageLink<CheeseMain>("havarti", CheeseMain.class);
havarti.setParameter("Title", "Havarti");
havarti.setParameter("Group", "cheeseName");
add(havarti);

La URL que sale tiene el formatohttps://mysite.com/;jsessionid=B85EE5CB0349CCA2FE37AF76AB5C30C1?wicket:bookmarkablePage=:com.mycompany.cheese.CheeseMain&Title=Havarti&group=cheeseName.

Mi problema es que ya no quiero que la URL de este enlace se pueda marcar como favorita.Lo ideal sería que fuera algo sencillo como https://mysite.com/cheese, pero puedo vivir con una URL fea.Lo importante es que los parámetros no sean visibles.

¿Cómo debo cambiar la forma en que genero mis enlaces?He analizado las diferentes estrategias de codificación de URL que proporciona Wicket, pero ninguna elimina los parámetros;simplemente los muestran de manera diferente.

¿Fue útil?

Solución

Los parámetros aparecen en la URL solo si la página se puede marcar como favorita o el enlace específico se puede marcar como favorito.

Si creas un Link que navega a la página usando 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 apuntará a la versión de la página que se puede marcar, sino a una instancia con estado.

Sin embargo, para que esto funcione, no debe llamar al super(PageParameters) constructor (para que la página no tenga suficiente información para construir la URL sin estado).

En este ejemplo, puede navegar hasta el SecretPage a través de dos enlaces diferentes, uno sin estado, con marcadores y el otro con estado.

SecretPage También cuenta con dos constructoras.Uno recibe un PageParameters y llamadas super pasándolo.El otro recibe el valor directamente a través del parámetro constructor y no lo pasa a super (si hubiera llamado super(new PageParameters().add("message",message), como en la línea comentada, redirigiría automáticamente a una URL que se puede marcar como favorita).

Página de inicio.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"));
            }
        });
    }
}

Página de inicio.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>

PáginaSecreta.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()));
    }
}

PáginaSecreta.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, debes montarlo.Puedes hacerlo en tu WebApplication clase.

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 usa Wicket 1.5 (aún RC4.2) y necesita algunas modificaciones para funcionar con 1.4.x (algunos métodos y clases fueron renombrados o movidos a paquetes diferentes), pero la idea es la misma.

Otros consejos

Aún puede usar la estrategia de codificación de URL que elija y encapsular sus parámetros en una clase heredada como:

public class Havarti extends CheeseMain {
    public Havarti() {
        super(new PageParameters("Title=Havarti,Group=cheeseName"));
    }
}

Entonces puede usar: new BookmarkablePageLink<Void>("havarti", Havarti.class).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top