4

数年前から Wicket 1.3.7 を使用しており、現在プロジェクトを wicket 6.x にアップグレード中です。

?1すべての URL に追加されるページ バージョン パラメータ (例: ) と、それらを削除する方法について、多くの調査を行いました。(残念ながら、公式ドキュメントにはこれに関する詳細な情報が見つかりませんでした。) そうしている間に、私は多くの声明を読みました (Wicket の開発者ユーザーからの

ページのバージョンを追跡するために必要です。そうしないと、ステートフルになることはできません。

それを取り除くには、ページをステートレスにする必要があります

パラメータを追加せずAbstractComponentMapperにオーバーライドして、 のカスタム実装を使用することも提案されました。encodePageComponentInfoマウントされたページのステートフルネスを壊すという明らかな欠点があります。(たとえば、このSOの回答を参照してください)

昨日、私はRenderStrategy.ONE_PASS_RENDERに出くわしました。

試してみて、いくつかのテストを行った後、これが「古いウィケットの方法を復元する」ための設定であるという印象を受けました。ページ バージョンのパラメーターはなくなりましたが、私のページはステートフルです。

さて、欠点もあります。二重送信の問題を自分で処理する必要がある場合でも、それで問題ありません。

質問: 私が (まだ) 認識していないその他の欠点はありますか? 予想される驚きはありますか?

これは完璧な解決策のようです。私は、これが提案されていないウィケット開発者であっても、これらのパラメーターを取り除く方法について非常に多くの議論があるのはなぜだろうかと思いました....

前もって感謝します。

4

1 に答える 1

5

同様のアップグレード パスを経て、アップグレード後の私の最初の反応は、「うわー、これらは厄介な URL です...」でした。

最初は、ワンパス レンダリングに切り替えて、より優れた URL を取得しました。しかし、さらに詳しく調べたところ、「?id」は二重サムビットの問題を解決するだけではないことがわかりました。

Ajax コンポーネントを含むページは非常にステートフルになる可能性があります。ユーザーがページを操作すると、コンポーネントを追加したり、他のコンポーネントを削除したりします。ページを更新するか (F5)、別のページに移動してから、戻るボタンを押します。

ワンパス レンダリングに切り替えると、その機能が失われます。これは、ブラウザーがページ ストアのどのページがターゲットになっているかを識別する方法がなく、通常はページ オブジェクトの別のインスタンスになってしまうためです。

これは、「リスト結果」ページ (Ajax ページングとフィルタリングを使用して「アイテム」のリスト/テーブルを表示するページ) で特に顕著でした。このようなワンパス レンダリングのページでは、「次のページ」を数回クリックしたにもかかわらず、検索条件が失われたり、結果の先頭に戻ったりすることがよくありました。

「標準」のレンダリング メカニズムを使用することになりました (ワン パスの再レンダリングではありません)。URL は見栄えがよくありませんが、長所が短所を上回っていると感じました (そして、href は問題ないように見えます。ブラウザの URL バーだけです)。

もう 1 つの懸念事項は、サイトの「クロール性」です。302 や "url?id" が Google インデックスに影響を与えないようにするために、Wicket アプリケーションの init メソッドに次のコードを追加して、Google ボットのワンパス レンダリングを強制しました。

    setPageRendererProvider(new IPageRendererProvider() {
        @Override
        public PageRenderer get(RenderPageRequestHandler handler) {
            return new WebPageRenderer(handler) {
                @Override
                protected boolean isOnePassRender() {
                    // To avoid 302s with Google Bot and have good SEO.
                    String userAgent = ((HttpServletRequest) RequestCycle.get().getRequest().getContainerRequest()).getHeader("User-Agent");
                    if (StringUtils.contains(userAgent, "Googlebot")) {
                        return true;
                    } else {
                        return super.isOnePassRender();
                    }
                }
            };
        }
    });
于 2013-01-31T00:12:44.717 に答える