我目前正在使用以下代码创建一组链接:
BookmarkablePageLink<CheeseMain> havarti =
new BookmarkablePageLink<CheeseMain>("havarti", CheeseMain.class);
havarti.setParameter("Title", "Havarti");
havarti.setParameter("Group", "cheeseName");
add(havarti);
出来的网址有格式
https://mysite.com/;jsessionid=B85EE5CB0349CCA2FE37AF76AB5C30C1?wicket:bookmarkablePage=:com.mycompany.cheese.CheeseMain&Title=Havarti&group=cheeseName
。
我的问题是我不再希望此链接的网址是可收藏的。理想情况下,我希望它像https://mysite.com/cheese
一样简单,但我可以使用丑陋的URL。重要的是参数不可见。
我应该如何改变我生成链接的方式?我查看了Wicket提供的不同URL编码策略,但没有一个删除参数;他们只是以不同的方式展示它们。
答案 0 :(得分:8)
仅当页面可收藏,或者特定链接是可收藏的时,参数才会显示在URL中。
如果使用Link
(传递Page实例)而不是setResponsePage(Page)
(传递Page类)创建导航到页面的setResponsePage(Class<Page>, PageParameters)
,则创建的链接将不会指向该页面的可收藏版本,但属于有状态实例。
为了使这项工作成为可能,你不能调用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>
而且,要拥有一个简单的网址,例如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(某些方法和类被重命名,或移动到不同的包中),但这个想法是一样的。
答案 1 :(得分:0)
您仍然可以使用您选择的URL编码策略,并将您的参数封装到一个继承的类中,例如:
public class Havarti extends CheeseMain {
public Havarti() {
super(new PageParameters("Title=Havarti,Group=cheeseName"));
}
}
然后你可以使用:new BookmarkablePageLink<Void>("havarti", Havarti.class)
。