Più che un esempio ti lascio questo link in cui viene spiegato esattamente quali sono i benefici e i maggiori errori del @ViewScope
Più che un esempio ti lascio questo link in cui viene spiegato esattamente quali sono i benefici e i maggiori errori del @ViewScope
mmmmm... correggimi se sbaglio... Un BB @RequestedScoped a differenza di un altro @ViewScoped ha un ciclo di vita leggermente più breve. Il BB View rimane in vita a seguito di un aggiornamento di pagina attraverso ajax mentre viene reinizializzato in ogni altro caso( sia refresh della pagina e sia che un form presente nella stessa pagina richiami nuovamente se steso , sia con GET che con POST ).
La requested muore istantaneamente.
Però ho notato una cosa con la ViewScoped che marcando un metodo con l'annotazione @PreDestroy.. nonostante tutti questi casi esso non viene mai invocato... come mai? Devo preoccuparmi io di ucciderlo? Così ci saranno istanze su istanze...
Grazie ancora ciao
La risposta alla tua domanda è NI....
nel senso che il bean in view scoped viene reinizializzato se:
1) Avviene una navigazione con jsf-redirect=true
2) La view che ha attualmente invocato un action oppure ha richiesto l'accesso ad un qualche proprietà del BB (metodi get) è diversa dall'ultima view che ha invocato il BB.
I BB in request scope vengo sempre e comunque reinizializzati ad ogni accesso.
Sul perchè il @PreDestroy nn ti venga invocato cosi ad occhio nn te lo saprei dire, servirebbero altre informazioni come implementazione di jsf usata, application server usato, un esempio di view e bb in cui è presente il problema.
1)ma viene reinizializzato anche nel caso in cui la navigazione ha JSF-REDIRECT=FALSE.La risposta alla tua domanda è NI....
nel senso che il bean in view scoped viene reinizializzato se:
1) Avviene una navigazione con jsf-redirect=true
2) La view che ha attualmente invocato un action oppure ha richiesto l'accesso ad un qualche proprietà del BB (metodi get) è diversa dall'ultima view che ha invocato il BB.
2)cioè? praticamente se faccio una navigazione da una pagina verso un'altra pagina ,quest'ultima se invoca metodi sullo stesso BB che utilizzava la prima..esso viene reinizializzato... quindi dovrei effettuare la navigazione sempre sulla stessa pagina, ma non avrebbe senso... :?
ad esempio, ho 2 pagine xhtml PAGE1 e PAGE2
PAGE1:
PAGE2:codice:<html xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:p="http://primefaces.org/ui"> <h:head> <title>Really simple CRUD</title> </h:head> <h:body> <h:form id="form"> <h:commandButton value="ok" onclick="#{bean.incrementa()}"> <p:ajax event="click" update="form"/> </h:commandButton> <h:commandButton value="vai" action="page2"> </h:commandButton> <h:outputText value="#{bean.value}"/> </h:form> </h:body> </html>
questo è il BEAN:codice:<html xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:p="http://primefaces.org/ui"> <h:head> <title>example</title> </h:head> <h:body> <h:form id="form"> <H2> PAGE2 </H2> <h:outputText value="VALUE:#{bean.value}"/> </h:form> </h:body> </html>
e questo è FACES-CONFIG.XML:codice:package bean; import java.io.Serializable; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.faces.bean.ManagedBean; import javax.faces.bean.RequestScoped; import javax.faces.bean.ViewScoped; @ManagedBean @ViewScoped public class Bean implements Serializable { private int value; /** * Get the value of value * * @return the value of value */ public int getValue() { return value; } /** * Set the value of value * * @param value new value of value */ public void setValue(int value) { this.value = value; } @PostConstruct public void init() { System.out.println("initttttttt"); value = 0; } @PreDestroy public void fine() { System.out.println("SONO MORTO"); } public void incrementa() { value++; } }
Solo con la navigazione il metodo @PreDestroy viene invocato ... mentre in altri casi (ad esempio clicco su qualche link ecc ecc non viene invocato...)codice:<faces-config version="2.1" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/we...config_2_1.xsd"> <navigation-rule> <from-view-id>/page1.xhtml</from-view-id> <navigation-case> <from-action>page2</from-action> <to-view-id>/page2.xhtml</to-view-id> </navigation-case> </navigation-rule> </faces-config>
JSF2 + glassfish server
Riporto la risposta precendenteOriginariamente inviato da Flaka
2)cioè? praticamente se faccio una navigazione da una pagina verso un'altra pagina ,quest'ultima se invoca metodi sullo stesso BB che utilizzava la prima..esso viene reinizializzato... quindi dovrei effettuare la navigazione sempre sulla stessa pagina, ma non avrebbe senso... :?
La view che ha attualmente invocato un action oppure ha richiesto l'accesso ad un qualche proprietà del BB (metodi get) è diversa dall'ultima view che ha invocato il BB.
Mi sembra che sia proprio questo il caso....
E' ovvio che il @PreDestroy ti viene invocato solo quando quel bean viene distrutto....Solo con la navigazione il metodo @PreDestroy viene invocato ... mentre in altri casi (ad esempio clicco su qualche link ecc ecc non viene invocato...)
Cioè come detto prima in caso di navigazione etc....
Sisi appunto per questo dico che comunque in ogni caso di navigazione il bean muore.. perchè rimane limitato sempre all'interno della stessa pagina..Originariamente inviato da francesco.muia
Riporto la risposta precendente
La view che ha attualmente invocato un action oppure ha richiesto l'accesso ad un qualche proprietà del BB (metodi get) è diversa dall'ultima view che ha invocato il BB.
Mi sembra che sia proprio questo il caso....
Comunque ti ringrazio molto, questa discussione è stata molto bella ed utile!![]()
Lo dice la parola stessa @View (Vista, pagina).
Nulla è stato un piacere. (Ho rinfrescato la mia memoria....)