2010-12-02 43 views
5

Je dois passer un paramètre à un bean lorsque je fais un appel ajax.JSF - Passer un paramètre sur un appel ajax - Quel est le problème sur ce code?

Mon haricot est la suivante:

@ManagedBean 
@RequestScoped 
public class Selector { 
    @ManagedProperty(value="#{param.page}") 
    private String page; 

    @PostConstruct 
    public void init() { 
     if(page==null || page.trim().isEmpty()) { 
      this.page="homepage"; 
     } 

     System.out.println(this.page); 
    } 

    public String getPage() { return page; } 
    public void setPage(String page) { this.page=page; } 
} 

Et, quand je fais l'appel ajax, j'ai besoin (en raison du fait que je veux rendre un contexte différent) le paramètre de page. Donc, j'ai fait ceci:

// in this moment selector.page = articles 
<h:inputHidden value="#{selector.page}" id="page" /> 

<h:commandLink> 
    <f:setPropertyActionListener target="#{articlesSelector.order}" value="1" /> 
    <f:ajax event="click" render=":articlesContent"/> 
    <h:graphicImage value="img/arrow_up.png" alt="Arrow Up"/> 
</h:commandLink> 

Mais, sur la phase de demande d'application, la page toujours "page d'accueil". Il devrait obtenir le paramètre page à partir de la requête, l'appliquer à l'arbre des composants et afficher le contexte "articles". Pourquoi ça n'arrive pas?

Vive

Répondre

5

Parce que la valeur de <h:inputHidden> est uniquement définie lors de valeurs du modèle de mise à jour de phase. C'est en effet un comportement non intuitif qui a longtemps existé dans JSF. J'ai déjà signalé un problème à ce sujet, mais cela a été fermé comme "par conception".

Il existe plusieurs façons de résoudre ce problème, notamment la portée de la vue. Dans votre cas, vous pouvez utiliser <f:param> au lieu de <h:inputHidden>:

<h:commandLink> 
    <f:param name="page" value="#{selector.page}" /> 
    <f:setPropertyActionListener target="#{articlesSelector.order}" value="1" /> 
    <f:ajax event="click" render=":articlesContent"/> 
    <h:graphicImage value="img/arrow_up.png" alt="Arrow Up"/> 
</h:commandLink> 

Il sera alors disponible en tant que paramètre de demande #{param.page} et dans votre demande scope bean être ainsi fixé comme @ManagedProperty.

+0

Oui, un peu étrange comme comportement. Mais fonctionne :) Merci !!! – markzzz

+0

De rien. – BalusC

+0

P.S. comme sauvetage JSF, n'oubliez pas http://stackoverflow.com/questions/4334424/jsf-why-setter-is-not-called-this-time et http://stackoverflow.com/questions/4304763/jsf- problem-with-viewscope (peut-être vous ne les avez pas vu héhé) – markzzz