È probabilmente una sorta di domanda architettonica, ma deve comunque avere una "soluzione di best practice" o uno standard accettato.Utilizzo del bean gestito con scope sessione jsf per rappresentare i dati statici gerarchici
Sto parlando di alcuni dati statici che devono essere visualizzati sul sito, come catalogo di prodotti, elenco di menu e voci di menu, elenco di blocchi di breadcrumb ecc. Questa opzione è disponibile quando si utilizza un CMS standard, I supporre.
Ma mi piacerebbe utilizzare una soluzione JSF pura per questo problema.
Quindi, per tornare alla domanda, le mie elaborazioni derivano sui seguenti principi:
dati non dovrebbe essere codificato in facelets, quindi io uso di database per contenere i valori, come nel seguente lo script db (MYSQL nel mio caso):
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;
vorrei poi di utilizzare la classe di entità che si terrà in un @ManagedBean e visualizzarli in una vista, come
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>
L'installazione sopra descritta funziona, ma sembra un po 'scomodo. Quindi, vorrei sollevare questioni seguenti aperta, 'best practice' per la comunità JSF:
- Che cosa è un modo corretto di creare un fagiolo catalogo come questo:
- Un
@SessionScope
di fagioli che verrà caricato una volta e visualizzato di nuovo su ogni vista o - Un bean
@RequestScoped
che accederà al database in ogni visualizzazione di pagina.
- Un
- c'è un modo per impostazione funzioni ricorsive in vista facelet, o io dovrebbe limitare il livello di nidificazione catalogo, per esempio, 2 o 3.
- Vorrei visualizzare una sorta di catalogo modificati, esponendo più raggruppa gli utenti registrati, a seconda del ruolo (colonna aggiunta in una tabella di database) e visualizza il catalogo di base quando nessun utente esegue l'accesso. Inoltre, vorrei inserire di tanto in tanto alcuni nuovi gruppi nel catalogo e non costringere gli utenti a log in, ma visualizzare nuovamente i dati corretti in una sola volta:
- devo filtrare gruppi nel livello di business e di esporre un CatalogueGroup filtrato per il fagiolo, o ti caricare l'intero catalogo e limitare il suo c hildren in views con rendered = false;
- L'esposizione di un intero catalogo in sessione è un modo corretto di andare;
- E 'possibile inviare eventi di modifica all'aggiunta di nuove voci di database a tutto il corrente CatalogueBean attivo sul server che impone l'aggiornamento delle proprietà (CatalogueGroup) o per ottenere questa funzionalità, è necessario utilizzare solo il bean
@RequestScoped
; - Nel caso in cui l'utilizzo di bean con scope richiesta sia l'unica alternativa sarà saggio accedere al database per ottenere dati così frequenti che raramente cambiano o c'è un modo più intelligente di fare le cose;
- Quando l'utente esegue l'accesso (e si disconnette) esiste già un'istanza del catalogo con ambito sessione, come aggiornarlo: è necessario eseguirlo manualmente in action/action listener oppure è necessario invalidare la sessione o eseguire un'operazione più appropriata alla situazione