2010-12-03 16 views
3

J'ai essayé simplement:JSF 2.0 Comment créer des UIComponents à économie d'état?

public class UIDemoComponent extends UIComponentBase { 

    private String someVariable; // this gets always cleared, getters/setters omitted 

    public UIDemoComponent() { 
     super(); // place breakpoint here 
    } 

    @Override 
    public void encodeBegin(FacesContext context) throws IOException { 

     HtmlForm form = new HtmlForm(); 
     form.setStyle("padding: 10px; background-color: blue;"); 
     getChildren().add(form); 

     AjaxBehavior behavior = new AjaxBehavior(); 
     behavior.setRender(Arrays.asList("@form")); 
     form.addClientBehavior("click", behavior); 
    } 
} 

Je me suis inscrit un gestionnaire d'étiquette et inséré avec succès le composant dans la page. Cependant, lorsque je clique sur le formulaire bleu rendu, JSF recrée le composant (le point d'arrêt du constructeur est intercepté). L'effet de ceci est que toutes les variables d'instance sont perdues. Comment est-il supposé sauvegarder les données dans les composants s'ils sont toujours recréés?

J'ai essayé majeur et l'inspection de l'état des mécanismes de StateHolder et conjurer PartialStateHolder wihout chance:

@Override 
public Object saveState(FacesContext context) { 
    return super.saveState(context); // breakpoint 
} 

@Override 
public void restoreState(FacesContext context, Object state) { 
    super.restoreState(context, state); // breakpoint 
} 

JSF exécute la saveState lorsque la page et les composants sont créés, mais restoreState est jamais appelé. En fait, lorsque la requête AJAX est en cours de traitement, une nouvelle instance de UIDemoComponent est créée mais la méthode saveState est à nouveau appelée , au lieu de restoreState.

Comment créer un tel composant d'économie d'état (qui conserve les champs d'instance sur les requêtes AJAX)?

Répondre

3

On dirait que JSF exécute des pré-vérifications sur l'objet state et n'exécute pas du tout restoreState si aucun champ personnalisé n'est entré. Ce n'est qu'après avoir réellement inséré des valeurs personnalisées dans l'objet d'état que le restoreState est appelé.

Par exemple:

@Override 
public Object saveState(FacesContext context) { 
    Object[] rtrn = new Object[2]; 
    rtrn[0] = super.saveState(context); 
    rtrn[1] = "dummy"; 
    return rtrn; 
} 

Après cela, le restoreState est appelé et champs de propriété peuvent être restaurés comme voulu.