2012-11-13 15 views
5

È 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:

  1. 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; 
    
  2. 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:

  1. 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.
  2. c'è un modo per impostazione funzioni ricorsive in vista facelet, o io dovrebbe limitare il livello di nidificazione catalogo, per esempio, 2 o 3.
  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

risposta

1

Molto interessante, ma forse così aperta domanda messa in campo.

Prima di tutto l'ambito dipende dall'utilità che fornirai al tuo catalogo. Ti suggerisco di passare attraverso @ViewScoped se vuoi collegare i dati a una vista particolare o @SessionScoped se il tuo obiettivo è quello di implementare qualcosa come un carrello della spesa.

Per le funzioni ricorsive penso che si dovrebbe evitare questo tipo di pratica in vista pura (xhtml) livello e utilizzare una libreria come Primefaces o Richfaces che hanno built-in componenti per ciò che si vuole fare. Usandoli devi solo occuparti della loro struttura logica programmaticamente all'interno del tuo bean di backing gestito.

Infine, per i limiti del catalogo, suggerisco di caricare solo quello che si intende utilizzare dal database. In questo modo non sovraccarichi né il database del server o server-client. È possibile avere un bean @SessionScoped che gestisce la sessione dell'utente loggato corrente e in base a ciò è possibile chiedere al database alcuni valori o altri.

Inoltre si devono prendere a cuore il vostro catalogo, se si sta facendo un sacco di modifiche su di esso durante la sessione, forse @ViewScoped fagiolo è una scelta migliore, perché sarà realoaded ogni volta che viene richiesto vista. Se si utilizza il bean @SessionScoped per questo è necessario aggiungere manualmente ogni modifica su di esso, al fine di mantenerlo aggiornato durante la sessione.

"load the whole catalogue and limit its children in views with rendered=false"

Questo è un lavoro che non si deve fare se lo si fa il mio modo di dire. Valutare in modo condizionale ciascuno dei nodi dell'albero può essere un inferno se si gestisce un albero complesso e si introduce più logica nella vista. Sicuramente dovresti evitarlo il più lontano possibile.

Anche se hai già raggiunto una soluzione, questa è la mia idea principale.

1

È possibile utilizzare una cache per memorizzare i menu per vari ruoli utente. Quindi invalidi la cache quando inserisci nuovi dati nel database (se lo inserisci da una pagina di amministrazione) o puoi impostare la scadenza della cache dopo un certo periodo (una volta al giorno, ogni poche ore, ecc.) E tu rileggere i dati quando la cache scade.

Problemi correlati