2012-03-29 16 views
0

私はショップシステムを開発しました。いくつかの選択メニューでフィルタリングされた利用可能な項目をリストする製品ページがあります。各製品についてのいくつかのコンテンツを表示する1つのアイテム詳細ページもあります。そのページの内容はxmlプロパティファイルから読み込まれます。アイテムのリストビュー内のリンクをクリックすると、いくつかの詳細を表示するために、アイテム固有のGETパラメータが設定されます。パラメータ値を使用すると、ロードされたキー名を変更することで、プロパティからその特定の項目のコンテンツを動的に読み込むことができます。wicket:マークアップで異なるコンテンツを生成するリクエストで同じクラスに異なるパスをマッピングします

これまでのところよくできていましたが、実際にはうまくいきませんでした。バックグラウンドに非常に多くの。いくつかの詳細を得ることができます。

ほとんどの場合、これはいくつかのSEOの動機です。これまでは、ステートフルなページのURLにはpageinstance IDに問題があります。不安定なURLだけでなく、wicketがURLを操作するために302のリダイレクトを行っているためです。おそらく私はその問題を解決するためにitem detailページのstatefullコンポーネントを削除します。

今、販売されている商品には、詳細ページへのリンクを含むQRコードがあります。これらのリンクは自分では設計されておらず、あなたが想像しているように、実際のURLのように全く異なって見えます。 QRコードのURLのパスが「/ shop/item1」となります。ここで、item1は製品名です。私のページクラスはItemDetailPageになります。 Webアプリケーション#init()にマウントしているIRequestMapperを書き込んで、着信リクエストURLを解決し、このIRequestMapperで解決する必要があるかどうかをチェックします。もしそうなら、私はPageProviderを使って自分のページを構築し、それに対する要求ハンドラを返します。

public IRequestHandler mapRequest(Request request) { 
       if(compatibilityScore>0) { 
        PageProvider provider = new PageProvider(ItemDetailPage.class, new ItemIDUrlParam(request.getUrl().getPath().split("/")[1])); 
        provider.setPageSource(Application.get().getMapperContext()); 
        return new RenderPageRequestHandler(provider); 
       } 
       return null; 
      } 

ご覧のとおり、私の詳細ページで処理できるパラメータを構築します。しかし、得られたURLはあまり良くありません。私はリダイレクトせずに、ブックマーク可能なコンテンツをそれにマッピングすることによって元のURLを保持したいと思います。 私の最初の考えはURLのパラメータをパスの形で再構築するURLCodingStrategyを実装することでした。私はHybridUrlCodingStrategyがそういうことをしていると思う。 IRequestMapperを使用してURLパス "/ shop/item1 /"を解決した後は、 "/ shop/item?1?id = item1"のようになります。コースの最初のパラメータはウィキットpageinstance IDで、詳細ページをステートレスに再構築すると、( HybridURLCodingStrategyを適用すると、pageinstance IDなしで/ shop/item/1/id/item1や/ shop/item/id/item1のように見えるかもしれません。 2番目のパス部分とパラメータ名を削除し、パラメータ値のみを使用して、URLが "/ shop/item1"のようになり、リクエストのときと同じURLになります。

Do you guysそれともスマートなアイデアを経験しているのですか? rewuirementsは

です0
  1. 各製品に対して1つの修正URL SEボット缶インデックス
  2. ないパラメータを有する
  3. ステートレスとブックマーク
  4. 全く302は、任意の方法でリダイレクトされません。
  5. 要求された項目のアイデンティティはドイツ マルセルからの種類に関してdetailpage

のために利用可能でなければならない

+2

あなたはどのバージョンのWicketを使用していますか?また、wicket 1.5でもwicket 1.5でもIRequestMapperを書く必要はありませんが、代わりにItemDetailPageを "/ shop"にマウントしてください。 1.5でのマウントについての素晴らしい記事をご覧ください:http://wicketinaction.com/2011/07/wicket-1-5-mounting-pages/ – bert

+0

私は1.5で、wicketstuffアノテーションでページをマウントしています。私は他のマッパーもいくつか搭載しています。私の状況は、関連するマークアップを持つ1つのクラスのみを異なるURLにマッピングする必要があるということです。私の詳細ページを/ shopにマップすると、ロードする必要があるactuelアイテムを特定するために、詳細ページの残りのパスを解決する必要があります。誰かが/ shop/item1を呼び出した場合、/ shopの下にマウントされているページにはそれに関する情報はほとんどありません。ここで何かが恋しい? –

+1

あなたがここで正しいことを理解しているかわかりません。しかし、 'item1'はPageparamだけです。 deteilsページをショップの下にマウントし、Wicketにパラメータとして/ shop/inをそのページに渡すよう伝えることができます。あなたは/ shop /の下に製品のリストを持ってもらいたいですか?パラメータはまったくありませんか?今すぐwicket MLのURLにあるページIDについての興味深い議論があります:http://www.mail-archive.com/[email protected]/msg69983.html Gruss ausドレスデン、バート – bert

答えて

6

バートが述べたように、あなたのユースケースは、通常のページ実装で覆われるべきで、見るもMountedMapper wiki page、あなたのケースのための具体的な例:「ITEM1」(私には非常に明確ではありません)項目のIDがあることを考えると

mountPage("/shop/${id}", ShopDetailPage.class); 

、あなたはnと今それを取得することができますWicketのamed pageパラメーターid。別の例は、多くの場合、一意のIDと(非ユニーク、変更)タイトルの両方含む、SEOのリンクで見られる:ページのインスタンスIDについて

mountPage("/shop/${id}/${title}", ShopDetailPage.class); 

を、それを取り除くためにいくつかの方法は、おそらく、最もよくありますあなたが言ったようにページをステートレスにすることです。別の簡単な方法は、レンダリング戦略としてIRequestCycleSettings.RenderStrategy.ONE_PASS_RENDERを設定することです(結果のためのAPIドキュメントを参照)。

+0

ああ私はこれを得て、そのパラメータ化されたマウントパスを知らなかった。あなたはその権利を持っています、 "item1"は一意のアイテム識別子です。それを試してみてください。また、@bertのリンクに触発されたページIDのものも試してみてください。私は、その日の後半にいくつかの詳細を含む私のソリューションと回避策を投稿します。 –

+0

上記のリンクからAbsoluteURLRendererを使用していることに気付きました。しかし、それは私のブックマーク可能なページのパスの前にホストを置かない!これをどのように強化するか考えていますか? –

+0

[Wiki](https://cwiki.apache.org/WICKET/getting-a-url-for-display.html)を参照してください。 – Heri

関連する問題