2011-10-17 2 views
20

Ho una pagina facce JSF che visualizza una tabella di dati a seconda della pagina che stanno visualizzando. Quando visualizzo la pagina 1, chiamo il metodo di azione view() per ottenere i dati dal database per entrambe le pagine e archiviarlo come un campo membro privato del bean (due array). Chiama anche conversation.start() sull'istanza di conversazione immessa nel metodo.Come funziona JSF 2 ConversationScope?

Quando l'utente fa clic sul pulsante "Avanti" (h:commandButton) per andare alla pagina 2, sto eseguendo un metodo next() per aggiornare il backing bean per puntare alla serie 2 in modo che stamperà il contenuto. Il problema è che l'array 2 non esiste più. Non so perché sto perdendo la portata della conversazione. Qualche idea?

//tells the object which page we are on, and thus what data to display. 
private int part = 1; 

// These arrays are filled with data but conversation scope doesn't 
// keep them on the next postback. 
private int[] part1 = new int[15], part2 = new int[15]; 

risposta

42

Si dovrebbe incollare qualche altro codice in modo che possiamo aiutarvi meglio. Da quello che dici non riesco a vedere dove hai chiamato il metodo per terminare la conversazione (ne hai bisogno anche quando lavori con lo scope della conversazione).

io incollare qui un piccolo esempio che penso vi aiuterà a capire come funziona la portata conversazione:

Questa è la pagina di avvio di una procedura guidata (ambito conversazione è grande per i maghi)

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core"> 

<h:head> 
    <title>ConversationScoped demo CDI(Component Dependency 
    Injection)</title> 
</h:head> 

<h:body> 



    <h3>ConversationScoped demo CDI(Component Dependency Injection)</h3> 

    <p>A conversation scope provides persistence until a goal is 
    reached<br /> 
    In this example the first entered value will remain until the end 
    method is called<br /> 
    in some page.<br /> 
    This is a really useful gadget, for making registration wizards and 
    similar tools...</p> 

    <h:form> 
     <h:outputText value="Type something" /> 
     <h:inputText value="#{ supportBB.someValue}" /> 
     <h:commandButton value="continue" action="#{ supportBB.onClick}" /> 
    </h:form> 

</h:body> 
</html> 

Questa è la seconda pagina della procedura guidata

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core"> 

<h:head> 
    <title>ConversationScoped demo CDI(Component Dependency 
    Injection)</title> 
</h:head> 

<h:body> 



    <h3>This is the next page(The value is saved in the conversation)</h3> 

     <h4><h:outputText value="#{ supportBB.someValue}"/></h4> 

    <h:form>   
     <h:commandButton value="Finish conversation" action="#{ supportBB.onKeepGoing}"/> 
    </h:form> 

</h:body> 
</html> 

E questa è la pagina in cui il campo di applicazione finisce

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core"> 

<h:head> 
    <title>ConversationScoped demo CDI(Component Dependency 
    Injection)</title> 
</h:head> 

<h:body> 



    <h3>This is the last page.The value still saved in conversation(until the end() method is called)</h3> 

    <h4><h:outputText value="#{ supportBB.someValue}" /></h4> 

    <h:form> 
     <h:outputText 
      value="Click finish to end the conversation(So saved values are disposed)" /> 
     <h:commandButton value="Finish" action="#{ supportBB.onFinish}" /> 
    </h:form> 

</h:body> 
</html> 

Qui il backing bean @ConversationScoped che inizia e termina la conversazione

package backingbeans; 

import java.io.Serializable; 

import javax.enterprise.context.Conversation; 
import javax.enterprise.context.ConversationScoped; 
import javax.inject.Inject; 
import javax.inject.Named; 

@Named() 
@ConversationScoped() 
public class SupportBB implements Serializable { 
    private static final long serialVersionUID = 1L; 
    private String someValue; 
    @Inject 
    private Conversation conversation; 

    // Control start and end of conversation 
    public void start() { 
     conversation.begin(); 
    } 

    public void end() { 
     conversation.end(); 
    } 

    // Navigation 
    public String onClick() { 
     if(someValue.equals("") || conversation == null) { 
      return "";//Dont go anywhere if the there was no input the field 
     } 
     start(); 
     return "nextpage?faces-redirect=true"; 
    } 

public String onKeepGoing() { 
    return "finish?faces-redirect=true"; 
} 

public String onFinish() { 
    end();// If triggered when there is no conversation(i.e URL Navigation) 
      // there will be an exception 
    return "index?faces-redirect=true"; 
} 

// Getters & Setters 
public String getSomeValue() { 
    return someValue; 
} 

public void setSomeValue(String someValue) { 
    this.someValue = someValue; 
} 

} 

penso che questo esempio è molto semplice e può aiutarti a capire come funziona. Chiedi se non capite qualcosa

NOTA:

penso, ma non sono sicuro al 100%, ma ConversationScope funziona solo se la backing bean è un fagiolo CDI. Questo significato utilizza l'annotazione @Named. Meglio verificarlo.

+0

Grazie per la risposta. Dovrò fare una prova quando torno sul mio altro computer stasera. Ho bisogno dei reindirizzamenti o posso semplicemente passare la pagina? – Adam

+3

@Adam Fisher Puoi semplicemente passare la pagina ma mi piace sempre usare i reindirizzamenti, solo per essere sicuro :) – sfrj

+4

Grazie per l'esempio dettagliato. Il mio problema stava usando @ManagedBean invece del @Named() con l'ambito. – Adam