0

ページに配置された検索結果のページがあります。詳細ビューに進み、結果ビューに戻ると、結果ビューはページ 1 に移動します。どうすればこれを修正できますか? 2 つの ViewScoped Bean を使用しています。私はSessionScopedを試しましたが、同じことをします。これを行う最善の方法は何ですか?

結果ページ

<f:metadata>
        <f:viewParam name="lang" value="#{search.language}" />
        <f:viewAction action="#{result.init()}" />
</f:metadata>
<h:form>
            <ui:repeat value="#{result.recipesView}" var="rec">
                <h:link value="#{rec.title}" outcome="recipeshow">
                    <f:param name="id" value="#{rec.id}" />
                </h:link>
                <br/>
                <h:outputText value="#{rec.id}"/><br/>
                <h:outputText value="#{rec.author}"/><br/>
                <h:outputText value="#{rec.createDate}"/><br/>
                <br/>
            </ui:repeat>
            <br/>
            <ui:repeat value="#{result.pagesArray}" var="page">
                <h:commandLink value="#{page.pageNumber}" disabled="#{page.pageDisabled}">
                    <f:ajax listener="#{result.doPages()}" render="@form"/>
                    <f:param name="currentPage" value="#{page.pageNumber}"/>
                </h:commandLink>                  &nbsp;
            </ui:repeat>
</h:form>
4

1 に答える 1

2

ビュー スコープ データの操作を行う場合、<h:commandLink>ポストバックを作成して現在のビューを操作している限り、それを介して現在のページを管理することができます。詳細ビューを表示すると、もはや結果ビューを扱っていないため、ビュー情報は基本的になくなります。そのため、ブラウザの戻るボタンを押すと、最初のページ (ページがキャッシュされていない場合) に戻るか、以前のままだったビュー (ページがキャッシュされている場合) に戻りますが、ViewExpiredException.

この困難を克服するために必要なことは、戻るボタンが指す URL に情報を保持することです。つまり、投稿リンク ( <h:commandLink>) を使用して結果をページングするのをやめて、代わりにリンクを取得 ( ) を使用するように切り替えます<h:link>。後者は、結果を表示するための関連情報 (現在のページ、ページング サイズ、ページング順序など) を保持する新しい get 要求を送信するために使用されます。<f:param>これは、タグとタグを使用して実行でき<f:viewParam>ます。この状態で戻るボタンを押すと、リクエストで定義されたパラメータを使用して結果が表示されます。結果の冪等性があなたの状況の鍵です。

<f:viewParam>そのため、ページング データを結果ビューに保持するためのタグがたくさんあります。また、コマンド リンクを、ページング データも表す<h:link>ネストされたs を持つプレーンな s に変更する必要があります。<f:param>

于 2013-09-23T20:13:14.767 に答える