2010-11-22 15 views
10

私は現在、JSF 2.0について学んでいます。この会話スコープ機能の存在を嬉しく思っています。これは、新しいタブまたは新しいウィンドウを開く際に非常に役立ちます同じページを持ち、別々のリソースを持ち、互いに上書きしません。JSF CDI:会話スコープBeanのベストプラクティス

しかし、会話をいつ開始するのか、いつ終了するのかについて、これをどのようにうまく実装するのが面白いですか。

私の場合、私は各JSFページごとに各CDI Beanを持っています。私はメニューがあり、それがクリックされるとAページにつながり、AからはBにつながり、BはCにつながり、CはDにつながり、これら4つのページはすべて1つに接続されます鎖。

BまたはCまたはDのBeanからAのBeanプロパティにアクセスすることは可能です.CまたはDのBeanなどからBのプロパティにアクセスすることもできます。

今はかなり混乱してについてのイム:

  • これらすべてのA B C Dはちょうどおそらく 対話スコープ内かどうか、または あるべきか?私は を別のページの というABCDチェーンの外にあると思うので、 のデータをBeanBに供給する方法はまだ分かりませんが、ページ Fのように、ページBのようにナビゲートすることができます。 これらすべてのABCDが1つの豆
  • と 会話を開始するには、イム コンストラクタについて考え、へ を組み合わせる必要がありますが、私は 会話を開始することを好むので、それは、 良いアイデアだと思ういけないかどうかを
  • まず、ない豆ページを アクセスするときの周りの
をぶら下げ 未使用のリソースがある文句を言わないようにと
  • は、 会話を停止するには

    これについてあなたの考えをお伝えください。

  • +3

    CDIは標準JSFの一部ではありません。CDIは 'javax.enterprise'パッケージの注釈をカバーするContexts and Dependency Injection(JSR-299)の略です。会話スコープは、標準JSFの一部でもありません。 JSF 1.2の時代にJBoss Seamの発明であり、JSF 2.0仕様でView Scopeとして採用されました。@ ViewScopedアノテーションでトグル可能です。さて、あなたは実際に何を話していますか? – BalusC

    +0

    こんにちはBalusC、説明をありがとう。私はCDIという用語を使って、私が使っていることを明確にしましたが、その情報は私の質問と無関係かもしれません:)私の知る限り、@ViewScopedは再表示された単一ページのもので、プロパティは持続した。しかし、私が会話の範囲から達成したいのは、複数のタブで同じページを開くことができるということです。各タブは、独自のセッションスコープを持つかのように表示されます。したがって、タブ上のmyBean.nameに 'albert'という値を送信すると、他のタブでmyBean.nameがオーバーライドされません。しかし、私はどこで会話を開始し、終了するのか混乱しています。 – bertie

    +0

    これは4ページあり、たとえばページAがブラウズページ、ユーザーが検索できるページB、詳細ページ、ユーザーが詳細を変更できるページCはユーザーがサブを変更できる場所です詳細などが含まれます。私が別のページに影響を与えずにいくつかのタブでページAを開くことができるようにしたいのであれば、私はAのbean上で会話スコープを使用する必要があります。しかし、私はそれがB CとDの会話範囲にもなると思いますか?私はどこで、いつ会話を始める/終えるべきかについて。つまり、ユーザーは新しいタブを開いてタブを閉じることができます。これを検出して会話を閉じるにはどうしたらいいですか? – bertie

    答えて

    11

    JSF 2は、リクエスト、ビュー、セッション、およびアプリケーションの各スコープを提供します。 CDIでは会話スコープが導入されましたが、さらに重要なことは、新しいスコープをプラットフォームに追加するための標準が導入されていることです。

    あなたが記述しているスコープは、ウインドウスコープのようなカスタムスコープにより適しているでしょう。このスコープを実装する二つのプロジェクトは、次のとおりです。

    1. Apache MyFaces CODI
    2. ICEfacesをJSF(非CDI)Window scope implementationを持っています。

    しかし、私はあなたの豆の構造を再考することをお勧めします。私は、1つのページから別のビューに(そして1つのViewスコープ・インスタンスから別のビュー・スコープ・インスタンスに)情報を伝播するために、JSF 2ビュー・パラメータと結合して、Viewスコープを自分自身にかなり好きにしました。

    MyFaces "View Access"スコープは、ナビゲートするページがそのスコープへの参照を保持している限り、Beanがスコープ内に留まる別のきちんとしたアプローチのようです。

    +0

    ありがとうございます!私はViewスコープについても考えており、マルチタブやマルチウィンドウ環境でも使用できます。あるビュー・スコープから別のビュー・スコープにビュー・パラメータを渡すことは、h:buttonとf:paramを入れ子にし、f:viewParamをf:metadataとしたものが正しいのでしょうか?私が間違っていないと、h:ボタンはGETリクエストを起こします。これは、例えばページB(POST)からの削除を押すと、ページAへのナビゲーションが返されることがあるため、私にとっては問題になります。この場合、ビューのパラメータをBからAに送信しますか? – bertie

    +0

    「?includeViewParams = true」という文字列をナビゲーションルールに追加すると、「ランディングページ」で定義されたビューパラメータが自動的に表示されます。 –

    +0

    よろしくお願いいたします。これについて一度読んだことがありますが、以前はこれを使うことは考えていませんでした。私はセッションスコープに慣れていると思います。これを試してみてください:) – bertie

    関連する問題