2010-12-02 13 views
5

Ich muss einen Parameter an eine Bean übergeben, wenn ich einen Ajax-Aufruf mache.JSF - Übergeben Sie einen Parameter bei Ajax-Aufruf - Was ist falsch an diesem Code?

Meine Bohne ist dies:

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

Und wenn ich den Ajax-Aufruf zu tun, ich brauche (aufgrund der Tatsache, dass ich einen anderen Kontext machen will), um die Seite Parameter. Also ich habe das getan:

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

Aber in der Apply-Phase, die Seite immer noch "homepage". Es sollte den Seitenparameter aus der Anfrage erhalten, ihn auf den Komponentenbaum anwenden und den Kontext "Artikel" rendern. Warum passiert nicht?

Prost

Antwort

5

Da der Wert von <h:inputHidden> wird nur während der Aktualisierung Modellwerte Phase eingestellt. Dies ist in der Tat ein nicht intuitives Verhalten, das lange in JSF existierte. Ich habe über ein Problem darüber berichtet, aber dies wurde als "per Design" geschlossen.

Es gibt mehrere Möglichkeiten, dies zu beheben, unter anderem den Ansichtsbereich. In Ihrem speziellen Fall können Sie <f:param> statt <h:inputHidden> verwenden:

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

Es wird dann als Anfrageparameter #{param.page} und in Ihrer Anfrage erhältlich scoped bean somit als @ManagedProperty eingestellt werden.

+0

Ja, ein bisschen seltsam als Verhalten. Aber funktioniert :) Danke !!! – markzzz

+0

Gern geschehen. – BalusC

+0

P.S. als JSF Rettung, vergessen Sie nicht http://StackOverflow.com/Questions/4334424/JSF-Why-Setter-is-Not-Called-this-time und http://StackOverflow.com/Questions/4304763/JSF- problem-with-viewscope (vielleicht hast du sie nicht gesehen hehe) – markzzz