2011-06-17 62 views
6

私は現在、このようなコードとリンクの集合作成しています:フォーマット https://mysite.com/;jsessionid=B85EE5CB0349CCA2FE37AF76AB5C30C1?wicket:bookmarkablePage=:com.mycompany.cheese.CheeseMain&Title=Havarti&group=cheeseNameを持って出てくるパラメータを隠すようにWicket URLを作成するにはどうすればよいですか?

BookmarkablePageLink<CheeseMain> havarti = 
    new BookmarkablePageLink<CheeseMain>("havarti", CheeseMain.class); 
havarti.setParameter("Title", "Havarti"); 
havarti.setParameter("Group", "cheeseName"); 
add(havarti); 

URLを。

私の問題は、もはやこのリンクのURLをブックマークできるようにしたくないということです。理想的には、https://mysite.com/cheeseのような単純なものにしたいですが、私は醜いURLで暮らすことができます。重要なことは、パラメータが表示されないことです。

リンクを生成する方法を変更するにはどうすればよいですか?私はWicketが提供するさまざまなURLエンコード戦略を見てきましたが、それらのどれもがパラメータを削除しませんでした。彼らはそれらを異なって表示するだけです。

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

が次にあなたが使用することができます: new BookmarkablePageLink<Void>("havarti", Havarti.class)

+0

「ブックマーク可能」ビットを省略し、単純な「PageLink」を使用します。私が正しく覚えていれば、うまくいくはずです。 – biziclop

+0

@biziclop:私は標準の 'Link'を使用しようとしていました。' Link'の抽象クラスなので、 'Link'のサブクラスです。 'PageLink'は推奨されていません。Javadocは代わりに' BookmarkablePageLink'か 'Link'を使うことを勧めます。 – Pops

+0

@Lord Torgamusさて、 'Link'を使ってください。 :)またはあなたはそれが廃止され、 'PageLink'を使用して暮らすことができます。私は 'Link'を使うのがはるかに複雑になることはわかりませんが。これについてもう少し詳細を追加できますか?私たちは 'Link'sで簡単な解決法を試すことができます。 – biziclop

答えて

8

パラメータは、ページがブックマーク可能な場合、または特定のリンクがブックマーク可能な場合にのみ、URLに表示されます。あなたは(Pageクラスを渡す)の代わりにsetResponsePage(Class<Page>, PageParameters)の(ページのインスタンスを渡す)setResponsePage(Page)を使用してページに移動Linkを作成する場合

、作成したリンクは、ページのブックマークのバージョンに、しかしステートフルを指していますインスタンス。

このようにするには、super(PageParameters)コンストラクタを呼び出さないでください(ページにステートレスURLを構築するのに十分な情報がないようにする必要があります)。

この例では、ステートレス、ブックマーク可能、ステートフルの2つの異なるリンクを介してSecretPageにナビゲートできます。

SecretPageにも2つのコンストラクタがあります。 1つは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のような単純なURLを使用するには、それをマウントする必要があります。 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; 
    } 
} 

この例では、自動改札1.5(まだRC4.2)を使用し、1.4.xので動作するようにいくつかの変更を必要とする(一部のメソッドやクラスの名前が変更、または別のパッケージに移動された)が、アイデアがあります同じ。

+0

私は実際にWicket 1.4.1を使用していますので、このコードを変換しなければなりませんでした。あまりにも難しいことではありませんでしたが、私は最初の 'SecretPage'コンストラクタの最後の行に困惑しました。なぜtoString()に引数を与えるのですか?それは私のためにコンパイルされません。 – Pops

+0

APIが1.5で変更されました。 1.4では、同等のものは 'parameters.getString(" message "、" No message! ")のようになります。 – tetsuo

+0

ああ、うわー、' toString() 'の意図的なパラメータ。私はそれを考慮しなかった。私はそれがタイプミスだと思った。その修正により、これは説明どおりに動作するように見えます。今、私のプロジェクトのためにそれを変更する方法を理解する.... – Pops

0

あなたはまだのような継承されたクラスに選択のあなたのURLのエンコード方式を使用して、パラメータをカプセル化することができます。

+0

この戦略では、URLは引き続き情報を放棄します。また、実際にパラメータを取ってDBを呼び出すだけのページを置き換えるために、何百もの新しいクラスを作成する必要があります。 (私のコードには例があります;私は実際にチーズアプリを構築していません)。 – Pops

+0

@Lordこれは、パラメータを表示せずに実行する唯一の方法です。もう1つのことは、URLを構築し、コンストラクタでそれらを復号化するときにパラメータを暗号化することです(暗号化された値は引き続き表示されます)。あなたがチーズアプリをxDしているのかどうか本当にわかりません。自分のコードをあなたのものに関連させたいだけでした。 – Marcelo

関連する問題