如何创建隐藏其参数的Wicket URL?

我目前正在创建一组包含以下代码的链接:

BookmarkablePageLink havarti = new BookmarkablePageLink("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是可collections的。 理想情况下,我希望它像https://mysite.com/cheese一样简单,但我可以使用丑陋的URL。 重要的是参数不可见。

我应该如何改变我生成链接的方式? 我查看了Wicket提供的不同URL编码策略,但没有一个删除参数; 他们只是以不同的方式展示

仅当页面可collections,或者特定链接是可collections的时,参数才会显示在URL中。

如果创建使用setResponsePage(Page) (传递Page实例)而不是setResponsePage(Class, PageParameters) (传递Page类)导航到页面的链接,则创建的链接将不会指向可collections的版本页面,但是有状态的实例。

但是,要使其工作,您不能调用super(PageParameters)构造函数(以便Page没有足够的信息来构建无状态URL)。

在此示例中,您可以通过两个不同的链接导航到SecretPage ,一个是无状态的,可SecretPage书签的,另一个是有状态的。

SecretPage还有两个构造函数。 一个人收到一个PageParameters并调用super传递它。 另一个通过construcor参数直接接收值,并且不会将它传递给super (如果它被称为super(new PageParameters().add("message",message) ,就像在注释行中一样,它会自动重定向到可collections的URL)。

HomePage.java:

 public class HomePage extends WebPage { public HomePage(final PageParameters parameters) { add(new BookmarkablePageLink("bookmarkable", SecretPage.class, new PageParameters().add("message", "This message will appear in the URL"))); add(new Link("instance") { @Override public void onClick() { setResponsePage(new SecretPage("This message will NOT appear in the URL")); } }); } } 

HomePage.html:

   

Bookmarkable link (stateless)

Hidden parameters link (stateful)

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("back", getApplication().getHomePage())); } } 

SecretPage.html

   

BACK

并且,要拥有一个简单的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 getHomePage() { return HomePage.class; } } 

这个例子使用Wicket 1.5(仍然是RC4.2),并且需要一些修改才能使用1.4.x(一些方法和类被重命名,或移动到不同的包),但想法是一样的。

您仍然可以使用您选择的URL编码策略,并将您的参数封装到inheritance的类中,例如:

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

然后你可以使用: new BookmarkablePageLink("havarti", Havarti.class)