2010-11-22 13 views
10

Attualmente sto imparando su JSF 2.0 e sono così felice dell'esistenza di questa funzione dell'ambito di conversazione, che è molto utile per aprire una nuova scheda o una nuova finestra sul stessa pagina e con risorse separate, non sovrascrive l'una con l'altra.JSF CDI: best practice per scope scope [s]

Ma sono curioso su come implementarlo in modo corretto, su quando iniziare la conversazione e quando chiuderla.

Nel mio caso, ho ogni bean CDI per ogni pagina JSF. E diciamo che ho un menu, e quando viene cliccato, questo porterà alla pagina A, e da A, potrebbe portare a B, B potrebbe portare a C, C potrebbe portare a D, tutte queste 4 pagine sono collegate in una catena.

L'accesso alle proprietà del bean di A dai bean B o C o D è possibile, l'accesso alle proprietà di B è possibile anche dai bean C o D e così via.

ora Im molto confuso su:

  • se tutti questi B A C D dovrebbe essere portata conversazione o no, o forse solo A? Perché penso che a volte da un'altra pagina che è al di fuori della catena ABCD, come una pagina F, potrebbe navigare alla pagina B, anche se non so come fornire i dati al bean B ancora.
  • se tutti questi ABCD dovrebbero essere combinati in un unico chicco
  • dove e quando iniziare il conversazione, im pensando al costruttore , ma io non penso che sia una buona idea , perché preferisco partire la conversazione occasione del primo accesso pagina, non il fagiolo
  • dove e quando interrompere la conversazione, in modo che non ci sarà risorse inutilizzate in giro

Per favore condividi le tue considerazioni al riguardo.

+3

CDI non fa parte del JSF standard.CDI è l'acronimo di Contexts and Dependency Injection (JSR-299) che copre le annotazioni del pacchetto 'javax.enterprise'. Anche Conversation Scope non fa parte del JSF standard. È stata un'invenzione di JBoss Seam durante l'età di JSF 1.2 ed è stata adottata dalle specifiche JSF 2.0 come View Scope, modificabile con l'annotazione '@ ViewScoped'. Ora, di cosa stai parlando? – BalusC

+0

Ciao BalusC, grazie per i chiarimenti. Ho usato il termine CDI solo per chiarire cosa sto usando, ma forse quell'informazione non è correlata alla mia domanda, le mie scuse :) Per quanto ne so, il @ViewScoped è per una singola pagina che viene nuovamente visualizzata e le proprietà saranno persisteva. Ma quello che volevo ottenere dall'ambito della conversazione è che posso aprire la stessa pagina su più schede, con ogni scheda come se avesse il proprio ambito di sessione. Quindi, inviando il valore 'albert' su myBean.name su una scheda, non sovrascrivere myBean.name su altre schede. Ma sono confuso su dove iniziare e terminare la conversazione. – bertie

+0

E questo mi confonde di più se ci sono 4 pagine, per esempio, la pagina A è una pagina di navigazione, dove l'utente può cercare, la pagina B è la pagina di dettaglio, dove l'utente può modificare i dettagli, la pagina C è dove l'utente può modificare sub dettaglio e così via. Se volessi essere in grado di aprire la pagina A in diverse schede senza che ne influenzasse un'altra, devo usare l'ambito della conversazione sul bean di A. Ma suppongo che sarà lo scopo della conversazione anche per B C e D? Inoltre su dove e quando dovrei iniziare/terminare la conversazione. Voglio dire, l'utente può aprire nuove schede e chiudere le schede. Come posso rilevare questo e chiudere la conversazione? – bertie

risposta

11

JSF 2 fornisce ambiti di richiesta, vista, sessione e applicazione. CDI introduce l'ambito di conversazione, ma, soprattutto, introduce uno standard in base al quale è possibile aggiungere nuovi ambiti alla piattaforma.

L'ambito che si sta descrivendo è probabilmente più adatto a un ambito personalizzato come un ambito finestra. Due progetti di attuazione questo scopo sono:

  1. Apache MyFaces CODI
  2. IceFaces ha una JSF (non CDI) Window scope implementation.

Tuttavia, vorrei incoraggiarvi a ripensare la struttura del fagiolo. Mi sono appassionato allo stesso ambito View, abbinato ai parametri di visualizzazione JSF 2 per diffondere informazioni da una pagina all'altra (e da un'istanza dell'ambito View a un'altra).

L'ambito "Visualizza accesso" di MyFaces sembra un altro approccio pulito, in cui un bean rimane nell'ambito di visibilità fintanto che le pagine che si spostano mantengono un riferimento a tale ambito.

+0

Grazie! Ho pensato anche a View scope, e potrebbe essere usato anche in ambiente multitab o multiwindow. Quello che intendevi passando i parametri di visualizzazione da un viewcope ad un altro viewcope, è quello ottenuto da h: button e nested f: param, e con f: metadata con nested f: viewParam, sono corretto? Se non mi sbaglio, il pulsante h: risulterà nella richiesta GET, e questo mi pone un problema, poiché a volte, per esempio, premendo cancella dalla pagina B (POST) si ritorna alla pagina A. C'è un modo per inviare i parametri della vista da B ad A in questo caso? – bertie

+0

Puoi aggiungere la stringa "? IncludeViewParams = true" a una regola di navigazione e i parametri della vista definiti nella "pagina di destinazione" verranno automaticamente inclusi per te. –

+0

Ok, grazie. Leggi di questo una volta, ma non hai mai pensato di usarlo prima. Penso di essermi abituato allo scope della sessione dove tutto è dove si trova. Devi provare questo :) – bertie

Problemi correlati