0

私はデータテーブルを持っています:

    <h:dataTable binding="#{table}" value="#{chooseKittens.kittenList}">
      <h:column>
        <p:commandLink value="#{chooseKittens.kittenList[table.rowIndex]}" action="#{chooseKittens.petKitten}"/>
      </h:column>
    </h:dataTable>

dataTable は、別のページに移動するためのリンクです。ただし、別のページに移動したときに、クリックしたコマンド リンクの値を保存して、後続のビューで表示できるようにしたいと考えています。SessionScope なしでこれを行う方法はありますか? t:saveState を調べましたが、Datatable でクリックされた変数だけを保存する方法がわかりません。SessionScope が利用可能な唯一のものである場合、kittenList を別のスコープにする方法はありますか? (子猫リストは、新しい子猫がデータベースに追加されると変更されるため、RequestScope または ViewScope にある必要があります)。

4

1 に答える 1

2

ビュー間で情報を共有したい場合は、一般的に使用される 2 つの方法を検討できます。

  1. GET パラメータとして次のビューに情報を渡す

    この場合、次のようにプレーンなナビゲーション リンクを生成する JSF コンポーネントを使用し、そのリンクにクエリ パラメータを追加します。

    <h:link value="Next page" outcome="/view-kitten">
        <f:param name="id" value="#{kitten.id}"/>
    </h:link>
    

    受信ページでは、パラメーターは次の方法で利用できます。

    <f:metadata>
        <f:viewParam name="id" value="#{kittenBean.id}/>
    </f:metadata>
    

    より優れた情報は、何に使用でき、何に使用できますか? で見つけることができます。<f:metadata><f:viewParam>

  2. を使用して、リダイレクトされたビューに情報を渡しますFlash

    この場合、コマンド コンポーネントのアクション メソッドでリダイレクトを実行し、Flashオブジェクトを使用して必要なデータをターゲット ビューにアタッチします。

    <h:commandButton value="Next page" action="#{bean.next}"/>
    

    public String next() {
        //do business job
        FacesContext.getCurrentInstance().getExternalContext().getFlash().put("kitten", selectedKitten);
        return "/view-kitten?faces-redirect=true";
    }
    

    EL を使用して、#{flash.kitten}またはプログラムで を使用して、ターゲット ビューで使用できますFacesContext.getCurrentInstance().getExternalContext().getFlash().get("kitten")

    拡張された例は、JSF2.0 - How to get the values in other jsf page's bean in request scope にあります。

最後に注意すべきことは、HTTP セッションを乱用しないことです。他の場所に属する情報でセッションを汚染するべきではありません。

于 2013-07-03T15:25:14.423 に答える