環境は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:読んでくれてありがとう!