Comment fonctionne JSF 2 ConversationScope?

j'ai une page facelets JSF qui affiche une table de données en fonction de la page qu'ils regardent. Lorsque j'affiche la page 1, j'appelle le view() méthode d'action pour obtenir les données à partir de la base de données pour les deux pages et le stocker comme un membre privé du champ bean (deux tableaux). J'ai aussi appeler conversation.start() sur l'instance de conversation injectée dans le view() méthode.

Lorsque l'utilisateur clique sur le bouton "suivant" (h:commandButton) Pour aller à la page 2, j'exécute un next() méthode pour mettre à jour le background bean pour pointer vers le tableau 2 afin qu'il imprime son contenu. Le problème est que le tableau 2 n'existe plus. Je ne sais pas pourquoi je perds conversation portée. Des idées?

//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];
20
demandé sur palacsint 2011-10-17 04:52:39
la source

1 ответов

vous devriez coller plus de code pour que nous puissions vous aider à mieux. D'après ce que vous dites, Je ne vois pas où vous avez appelé la méthode pour terminer la conversation(vous en avez besoin aussi lorsque vous travaillez avec la portée de la conversation).

je vais coller ici un petit exemple qui je pense vous aidera à comprendre comment la portée de la conversation fonctionne:

Ceci est la page de début d'un magicien(le cadre de Conversation est grand pour assistants)

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

Ceci est la deuxième page du magicien

<!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>

Et c'est la page où le champ se termine

<!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>

Voici la fève de soutien @ ConversationScoped qui commence et termine la conversation

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;
}

}

je pense que cet exemple est très simple et peut vous aider à comprendre comment il fonctionne. Demander si vous ne comprenez pas quelque chose

NOTE:

je pense, mais je ne suis pas sûr à 100% mais ConversationScope ne fonctionne que si le backing bean bean CDI. Ce moyen utilise l'annotation @Named. Mieux, vérifiez que.

46
répondu sfrj 2015-09-30 20:52:20
la source