Как я могу создать Wicket URL, который скрывает его параметры? - PullRequest
6 голосов
/ 17 июня 2011

В настоящее время я создаю набор ссылок с кодом, подобным следующему:

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

URL-адрес, который выходит, имеет формат https://mysite.com/;jsessionid=B85EE5CB0349CCA2FE37AF76AB5C30C1?wicket:bookmarkablePage=:com.mycompany.cheese.CheeseMain&Title=Havarti&group=cheeseName.

Моя проблема в том, что я больше не хочу, чтобы URL этой ссылки был добавлен в закладки. В идеале мне бы хотелось, чтобы это было что-то простое, например https://mysite.com/cheese, но я могу жить с ужасным URL. Важно то, что параметры не видны.

Как мне изменить способ создания моих ссылок? Я рассмотрел различные стратегии кодирования URL, которые предоставляет Wicket, но ни одна из них не удаляет параметры; они просто отображают их по-разному.

Ответы [ 2 ]

8 голосов
/ 18 июня 2011

Параметры появляются в URL-адресе только в том случае, если страница является закладкой или указанная ссылка является закладкой.

Если вы создаете Link, который переходит на страницу с помощью setResponsePage(Page) (передавая экземпляр страницы) вместо setResponsePage(Class<Page>, PageParameters) (с передачей класса Page) созданная ссылка будет указывать не на версию страницы с закладкой, а на экземпляр с состоянием.

Однако, чтобы эта работа работала, вы не должны вызыватьконструктор super(PageParameters) (так что на странице недостаточно информации для создания URL-адреса без состояния).

В этом примере вы можете перейти к SecretPage по двум различным ссылкам, одна из которых не содержит состояний и может быть добавлена ​​в закладки., а другой с состоянием.

SecretPage также имеет два конструктора.Каждый получает PageParameters и звонит super, передавая его.Другой получает значение напрямую через параметр construcor и не передает его super (если бы он вызвал super(new PageParameters().add("message",message), как в закомментированной строке, он автоматически перенаправил бы на закладку URL).

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>

И чтобы иметь простой URL, например http://host/app/secret, вы должны смонтировать его.Вы можете сделать это в своем 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;
    }
}

В этом примере используется Wicket 1.5 (все еще RC4.2), и для работы с 1.4 необходимо внести некоторые изменения.x (некоторые методы и классы были переименованы или перемещены в разные пакеты), но идея та же.

0 голосов
/ 18 июня 2011

Вы все еще можете использовать выбранную вами стратегию кодирования URL и инкапсулировать ваши параметры в унаследованный класс, такой как:

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

Тогда вы можете использовать: new BookmarkablePageLink<Void>("havarti", Havarti.class).

...