これはおそらく一種のアーキテクチャ上の質問ですが、それでも「ベストプラクティスソリューション」または受け入れられている標準が必要です。
製品のカタログ、メニューとメニュー項目のリスト、ブレッドクラムブロックのリストなど、サイトに表示する必要のあるある種の静的データについて話しています。このオプションは、標準のCMSを使用している場合に使用できると思います。
ただし、この問題には純粋なJSFソリューションを使用したいと思います。
したがって、質問に戻るために、私の詳細は次の原則に基づいています。
データをフェイスレットにハードコーディングしないでください。したがって、次のdbスクリプト(私の場合はMYSQL)のように、データベースを使用して値を保持します。
CREATE TABLE CatalogueGroup ( CatalogueGroupName VARCHAR(100) NOT NULL PRIMARY KEY, URLPath VARCHAR(200) NOT NULL, ParentGroupName VARCHAR(100) DEFAULT NULL, FOREIGN KEY (ParentGroupName) REFERENCES CatalogueGroup(CatalogueGroupName) ON UPDATE CASCADE ON DELETE SET NULL )ENGINE=InnoDB DEFAULT CHARSET=utf8;
次に、@ ManagedBeanに保持されるエンティティクラスを使用して、次のようなビューに表示します。
public class CatalogueGroup implements Serializable { private String catalogueGroupName; private List<CatalogueGroup> children = new ArrayList<CatalogueGroup>(); private CatalogueGroup parentGroup; //other stuff of this bean } @ManagedBean @SessionScoped public class CatalogueBean implements Serializable { private CatalogueGroup catalogue;//loaded via CatalogueGroupDAO with condition parentGroup == null //other stuff of this bean } //snippet of xhtml view for a two-level catalogue <ul><h:outputText value="#{catalogueBean.catalogue.catalogueGroupName}" /> <ui:rereat value="#{catalogueBean.catalogue.children}" var="group"> <li><h:outputText value="#{group.catalogueGroupName}" /></li> </ui:repeat> </ul>
上記の設定は動作しますが、ぎこちない感じがします。そこで、jsfコミュニティに次のオープンな「ベストプラクティス」の質問を提起したいと思います。
- 次のようなカタログBeanを設定する適切な方法は何ですか。
@SessionScope
一度ロードされ、すべてのビューに再表示されるBeanまたは@RequestScoped
すべてのページ表示でデータベースにアクセスするBean。
- フェイスレットビューで再帰関数を設定する方法はありますか、またはカタログのネストレベルをたとえば2または3に制限する必要があります。
- ある種の変更されたカタログを表示し、ユーザーの役割(データベーステーブルに追加された列)に応じて、ログインしたユーザーにより多くのグループを公開し、ユーザーがログインしていないときに基本的なカタログを表示したい。さらに、時々挿入したいカタログ内のいくつかの新しいグループは、ユーザーに再ログインを強制しませんが、適切なデータを一度に再表示します。
- ビジネスレイヤーでグループをフィルタリングし、フィルタリングされたCatalogueGroupをBeanに公開するか、カタログ全体をロードして、rendered=falseのビューでその子を制限します。
- セッション中のカタログ全体の公開は適切な方法ですか。
- サーバー上でアクティブな現在のすべてのCatalogueBeanに新しいデータベースエントリを追加する際に変更イベントを送信して、プロパティ(CatalogueGroup)を強制的に更新したり、この機能を実現したりすることはできますか?
@RequestScoped
Beanのみを使用する必要があります。 - リクエストスコープのBeanを使用することが唯一の代替手段である場合、データベースにアクセスしてデータを取得することが賢明であり、ほとんど変更されないか、よりスマートな方法があります。
- ユーザーがログイン(およびログアウト)すると、セッションスコープのカタログのインスタンスがすでに存在します。それを更新する方法:アクション/アクションリスナーで手動で実行する必要がありますか、セッションを無効にするか、状況により適切なことを実行する必要がありますか? 。