Параметры появляются в 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 (некоторые методы и классы были переименованы или перемещены в разные пакеты), но идея та же.