2010-11-24 9 views
0

ich werde versuchen, meine Sicherlich gehört in sehr wenige Linie von Codes zu erklären:.JSF - Vorlage und Ajax-Aufruf - Best Practices

template.xhtml - hier lade ich eine Seite als GET-Parameter genannt (ex index.xhtml? page = Homepage => i laden homepage.xhtml)

<h:panelGroup layout="block" id="content"> 
    <c:catch> 
     <ui:include src="#{selector.page}.xhtml" /> 
    </c:catch> 
</h:panelGroup> 

homepage.xhtml - meine eigene Homepage (das wird sich ändern, wenn im angemeldet oder nicht)

<h:panelGroup rendered="#{!login.loggedIn}"> 
    <h:outputLabel styleClass="content_title" value="im not logged" /> 
</h:panelGroup> 
<h:panelGroup rendered="#{login.loggedIn}"> 
    <h:outputLabel styleClass="content_title" value="im logged" /> 
</h:panelGroup> 

ajax call - so th ist das eigentliche Problem; wenn ich einen Anruf wie folgt tun:

<f:ajax event="action" execute="param1 param2" render=":content"/> 

selector bean:

package model; 

import javax.faces.bean.ManagedProperty; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.RequestScoped; 

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

    public String getPage() { 
     if(page.compareTo("")==0) { 
      this.page="homepage"; 
     } 
     return page; 
    } 

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

Ich werde die neuen Daten auf dem panelGroup content, laden, die auf der Vorlage definiert ist.

Das Problem ist, dass, wenn ich dies anrufe, verlor ich die page parameter (seted zuvor auf der Auswahl Bean), und ich kann nicht die aktuelle Seite neu laden.

Also, für Sie ist der Trick:

1 - setzen die Bohne SessionScoped?

2 - Überschreiten Sie den Ajax-Aufruf den Wert erhalten?

3 - Definieren Sie meine eigene Anwendung auf andere Weise?

würde Jeder Vorschlag geschätzt werden :)

Antwort

1

Pass in die nächste Anforderung als versteckte Eingabewert in der gleichen Form.

<h:inputHidden value="#{selector.page}" /> 
+0

Uhm ja. Tatsächlich klingt das sehr komisch für mich, denn auf "execute" möchte ich nur wenige Parameter übergeben, nicht die ganze Form (wie wir am letzten Tag besprochen haben). Ich muss das auf diesem Rahmen verstehen :) – markzzz

+0

Versucht auf diese Weise gerade, leider nicht diesen Inhalt laden. Ich denke, dass ich (zuerst) einen Wert als Voreinstellung auf meiner Auswahl-Bohne einstellen muss. Sehen Sie sich den Code aktualisiert an: Es wird nicht "index" angezeigt, wenn ich # {selector.page} in der Vorlage anrufe. Weiß nicht warum ... – markzzz

+0

Oh nein, ja, es funktioniert. Ich muss nur dieses inputhidden als "page" nennen :) Trotzdem kann ich immer noch den Standardwert für die Bean setzen. Danke für die Tipps BalusC, sieht aus wie du der Meister von JSF :) – markzzz