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)コンストラクターを呼び出してはなりません (ステートレス URL を構築するのに十分な情報が Page にないため)。

SecretPageこの例では、2 つの異なるリンク (1 つはステートレス、ブックマーク可能、もう 1 つはステートフル) を介してに移動できます。

SecretPageには 2 つのコンストラクターもあります。を受け取り、それを渡してPageParameters呼び出します。superもう 1 つはコンストラクター パラメーターを介して直接値を受け取り、それを に渡しません(コメント行のようにsuperが呼び出された場合、ブックマーク可能な URL に自動的にリダイレクトされます)。super(new PageParameters().add("message",message)

ホームページ.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 に答える