6

我目前正在使用如下代码创建一组链接:

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。重要的是参数不可见。

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

4

2 回答 2

8

仅当页面可添加书签或特定链接可添加书签时,参数才会出现在 URL 中。

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

但是,要完成这项工作,您不能调用super(PageParameters)构造函数(这样 Page 就没有足够的信息来构建无状态 URL)。

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

SecretPage也有两个构造函数。一个人收到 aPageParameters并调用super传递它。另一个直接通过 contrucor 参数接收值,并且不将其传递给super(如果它调用super(new PageParameters().add("message",message),如注释行中所示,它将自动重定向到可收藏的 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>

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 一起使用(一些方法和类被重命名,或移动到不同的包),但想法是相同的。

于 2011-06-18T01:22:25.110 回答
0

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

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

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

于 2011-06-17T20:05:20.053 回答