我目前正在使用如下代码创建一组链接:
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 可 Collection 。理想情况下,我希望它像 https://mysite.com/cheese
这样简单,但我可以接受丑陋的 URL。重要的是参数不可见。
我应该如何更改生成链接的方式?我查看了 Wicket 提供的不同 URL 编码策略,但它们都没有删除参数;他们只是以不同的方式显示它们。
最佳答案
仅当页面可添加书签或特定链接可添加书签时,参数才会出现在 URL 中。
如果您创建一个 Link
使用 setResponsePage(Page)
导航到页面(传递 Page 实例)而不是 setResponsePage(Class<Page>, PageParameters)
(传递 Page 类),创建的链接不会指向页面的可 Collection 版本,而是指向有状态实例。
不过,要使其正常工作,您不能调用 super(PageParameters)
构造函数(这样页面就没有足够的信息来构建无状态 URL)。
在此示例中,您可以导航到 SecretPage
通过两种不同的链接,一种是无状态的、可 Collection 的,另一种是有状态的。
SecretPage
也有两个构造函数。一个收到 PageParameters
并调用 super
通过它。另一个直接通过构造参数接收值,而不将其传递给 super
(如果它调用了 super(new PageParameters().add("message",message)
,就像在注释行中一样,它会自动重定向到一个可 Collection 的 URL)。
主页.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"));
}
});
}
}
主页.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>
secret 页面.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()));
}
}
secret 页面.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 一起使用(一些方法和类已重命名,或移至不同的包),但思想是相同的。
关于java - 如何创建隐藏其参数的 Wicket URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6390953/