1

環境はJSF2、GlassFish、PrimeFacesです。

私は非常に複雑なモデルでデータを編集するためのアプリケーションに取り組んでいます。

モデル内のすべてのクラスは他のクラスと関係があり、他のクラスは他のクラスと関係があります。多くの場合、特定のクラスについて、リレーションの「クラスター」(クラスの展開されたツリー全体)には、ツリー内の多くの場所に同じクラスが含まれます。

例えば ​​:

  • クラスAは、クラスB、C、およびDと関係があります。
  • クラスBには関係がありません。
  • クラスCはクラスBと関係があります。
  • クラスDはクラスEと関係があります。
  • クラスEはクラスBと関係があります。

コンテキストを要約したので、これが私を悩ませているものです。

クラスの特定のインスタンスのすべてのデータを同じページに配置するように設計上の決定が行われました。これを行うための現在のアーキテクチャは、特定の「ルート」クラスに対して次のとおりです。

「ルート」クラスはPrimeFacesTabViewに表示されます。タブは次のとおりです。

  • 「メイン」:クラスの単純な属性(文字列、整数、...)が含まれます。
  • リレーションごとに1つのタブがあります。
  • 各タブには、適切なXHTMLファイルを指すインクルードがあります。

リレーションが単一のクラスを指している場合、指しているXHTMLファイルは、ここで説明する「ルート」形式に似ています。適切なオブジェクトは、includeディレクティブのXHTMLファイルにパラメーターとして渡されます。ネストされたTabViewは最大で3つあります。

リレーションがリストを指している場合、指しているXHTMLファイルには、「追加」、「編集」、「削除」ボタンのあるリストが表示されます。適切なリストは、includeディレクティブのXHTMLファイルにパラメーターとして渡されます。

リストに関してはさらに複雑な点がありますが、今のところそこには行きません。単一の要素だけで、問題があることがわかります。

最初は、含まれるすべてのXHTMLファイルに同じパラメーター名を使用しました。パラメータがビューに対して「グローバル」であるため、これは機能しません。最初の表示では機能しているようですが、1つのタブが更新されるとすぐに、フォームが別のオブジェクトを指しているため、javax.el.PropertyNotFoundExceptionが発生します。

この問題を軽減するために、クラスごとに一意になるようにパラメーター名を変更しました。以前は、すべてのパラメーターは「要素」と呼ばれていました。変更後、クラスAのパラメーターは「aElement」と呼ばれ、クラスBのパラメーターは「bElement」などと呼ばれます。

これは、クラスター内のすべてのクラスが異なる場合に機能します。衝突が発生した場合、以前と同じ問題に戻ります。2つの異なるインクルージョンで、同じパラメーター名を異なる値で使用します。

私はそれを行うための非常に複雑な方法を考えましたが、それはJavascriptを使用しています:

  • 渡されたオブジェクトの一意の識別子である追加のパラメーターをXHTMLフォームに渡します。
  • XHTMLフォームで識別子を取得し、それをフォームの他の部分から分離された非表示フィールドに配置します。
  • 非表示フィールドが更新されないようにし、フォームがフォーカスを取得したときにその値を読み取り、その値を使用してAJAXリクエストによって適切なオブジェクトを取得します。

だから私の質問は:これを処理するための「純粋な」Java / JSFの方法はありますか?

TL; DR:読んでくれてありがとう!

4

1 に答える 1

0

非常に複雑な性質の場合、CDI は単純な JSF2 よりも多くの機能を提供します。プロデューサーを使用でき、実行時にオブジェクトを自由に評価および変更できます。

すでに作成されたものを追跡し、それに応じてネーミングを調整できます。たとえば、占有されているすべての名前をマップに保存します。幸運を。

于 2013-02-06T21:18:48.520 に答える